AXV

Foydalanuvchilarni Boshqarish

Identifikatsiya, Autentifikatsiya, Avtorizatsiya. Session va JWT tokenlar

10-sinfAdvanced Python Back-end2-hafta · 4-dars

Dars rejasi

Xavfsizlikning 3 ustuni

Identifikatsiya, autentifikatsiya va avtorizatsiya tushunchalari va ularning farqi.

Session vs JWT

Stateful va Stateless autentifikatsiya, JSON Web Token anatomiyasi.

Custom User & DRF

Email orqali kiruvchi Custom User modeli va SimpleJWT sozlamalari.

01

Xavfsizlikning 3 ustuni

Foydalanuvchini aniqlash va huquqlarni tekshirish

Xavfsizlikning 3 bosqichi

Har bir foydalanuvchi tizimga kirishda shu zanjirdan o'tadi

1. Identifikatsiya "Siz kimsiz?" Email / Login kiritish [email protected] 2. Autentifikatsiya "Haqiqatan sizmisiz?" Parol / SMS / Biometrika Isbotlash jarayoni 3. Avtorizatsiya "Nimalarga ruxsat bor?" Admin, Muallif, O'quvchi Huquq va rollar
02

Session vs JWT Token

Stateful va Stateless autentifikatsiyani taqqoslash

Session va JWT farqi

Session-based (Cookie) Sessiya server xotirasida (RAM/DB) saqlanadi Stateful (Server holatni eslab turadi) 1 mln foydalanuvchi = katta xotira sarfi Mobil ilovalar uchun noqulay JSON Web Token (JWT) Faqat mijozda saqlanadi Stateless (Server xotirani band qilmaydi) 1 mln foydalanuvchi = 0 KB server xotirasi Mobil, Web, Bot barchasiga mos

JWT tokenining 3 qismi

Nuqta bilan ajratilgan: Header . Payload . Signature

1. Header Algoritm & Token turi {"alg": "HS256", "typ": "JWT"} 2. Payload Foydalanuvchi ma'lumotlari {"user_id": 42, "exp": 1791108000} 3. Signature Raqamli imzo HMACSHA256( header+payload, KEY)

Access va Refresh tokenlar juftligi

Access Token (Qisqa muddat)

15-60 daqiqa yashaydi. Har bir API so'rovida yuboriladi: Authorization: Bearer <token>.

O'g'irlangan taqdirda ham muddati tezda tugaydi.

Refresh Token (Uzoq muddat)

7-30 kun yashaydi. Faqat yangi access token olish uchun ishlatiladi.

Foydalanuvchini har 15 daqiqada qayta login qilishdan qutqaradi.

03

Custom User modeli

Email orqali identifikatsiya va kengaytirilgan profil

src/apps/accounts/models.py

class User(TimeStampedModel, AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    full_name = models.CharField(max_length=160, blank=True)
    avatar = models.ImageField(upload_to="avatars/", blank=True, null=True)

    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS: list[str] = []

    def __str__(self) -> str:
        return self.email

SimpleJWT ni sozlash

AUTH_USER_MODEL = "accounts.User"

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
}

from datetime import timedelta
SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=60),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=7),
}

Token olish: POST /api/v1/auth/jwt/create/

Postman / HTTP Request

So'rov: {"email": "[email protected]", "password": "pass"}

HTTP 200 OK

{
  "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Atamalarni eslab qolamiz

Autentifikatsiya

Bosing va tekshiring

Haqiqiylikni isbotlash

Foydalanuvchi kiritgan parol yoki token orqali uning kimligini tasdiqlash.

JWT

Bosing va tekshiring

Stateless Token

Server xotirasini band qilmaydigan, raqamli imzoli xavfsiz token.

Refresh Token

Bosing va tekshiring

Yangilovchi kalit

Access token eskirganda yangisini olish uchun xizmat qiladi.

Tezkor bilim tekshiruvi

Nima sababdan JWT tokenda Signature (raqamli imzo) kerak?

To'g'ri! Signature tokenning daxlsizligini ta'minlaydi: u serverning maxfiy SECRET_KEY kaliti bilan imzolanadi va soxtalashtirishdan himoya qiladi.

Dasturchilar ko'p yo'l qo'yadigan xatolar

Xato: JWT Payload ichida maxfiy parollar yoki bank kartasi ma'lumotlarini saqlash (JWT ochiq o'qiladi!).
To'g'ri: Payload ichida faqat ommaviy ma'lumotlar saqlansin: user_id, email, roles.

Amaliy topshiriq 15 daqiqa

Oson apps/accounts/models.py da User va UserManager kodini yozing.
O'rta AUTH_USER_MODEL = "accounts.User" qilib, migratsiyani amalga oshiring.
Qiyin rest_framework_simplejwt orqali token oling va sarlavhada Bearer bilan testlang.
AXV

Darsni yakunlaymiz

Keyingi darsda: Ruxsatlar (Permissions) tizimi, IsAuthorOrReadOnly va kirish huquqlarini cheklash!

Identifikatsiya Autentifikatsiya Custom User JWT (Access & Refresh)