identifikatsiya, autentifikatsiya, avtorizatsiya, session, token, JWT, bcrypt, OAuth2PasswordBearer
10-sinfAdvanced Python Back-end5-hafta · 13-darsKim? Isbot? Ruxsat?
bcrypt va register
JWT, Bearer, Depends
12-darsda baza sessiyasi qaysi funksiya orqali beriladi?
get_db har so'rov uchun AsyncSession beradi (Depends(get_db)).Kim? Isbot? Ruxsat?
# JWT = header.payload.signature (base64url)
# header: {"alg": "HS256", "typ": "JWT"}
# payload: {"sub": "user-id", "exp": 1735000000}
# signature: HMAC(header.payload, SECRET_KEY)
from jose import jwt
token = jwt.encode({"sub": "42"}, "SECRET", algorithm="HS256")
data = jwt.decode(token, "SECRET", algorithms=["HS256"])
payload ni har kim o'qiy oladi (base64), lekin kalitsiz o'zgartira olmaydi: imzo buzilib qoladi. Shuning uchun maxfiy ma'lumotni payload ga yozmang.JWT ning qaysi qismi o'zgartirilmaganini kafolatlaydi?
bcrypt va register
from passlib.context import CryptContext
pwd = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_password(p: str) -> str:
return pwd.hash(p)
def verify_password(p: str, h: str) -> bool:
return pwd.verify(p, h)
@router.post("/register", response_model=UserRead, status_code=201)
async def register(data: UserCreate, db: AsyncSession = Depends(get_db)):
if await db.scalar(select(User).where(User.email == data.email)):
raise HTTPException(409, "Email band")
user = User(full_name=data.full_name, email=data.email,
hashed_password=hash_password(data.password))
db.add(user); await db.commit(); await db.refresh(user)
return user
== emas, faqat verify_password ishlatiladi.Parol bazada qanday saqlanadi?
hashed_password saqlanadi.JWT, Bearer, Depends
oauth2 = OAuth2PasswordBearer(tokenUrl="/auth/login")
def create_access_token(user_id: str) -> str:
exp = datetime.now(timezone.utc) + timedelta(minutes=60)
return jwt.encode({"sub": user_id, "exp": exp},
settings.jwt_secret_key, algorithm="HS256")
async def get_current_user(token: str = Depends(oauth2),
db: AsyncSession = Depends(get_db)) -> User:
try:
payload = jwt.decode(token, settings.jwt_secret_key, algorithms=["HS256"])
user = await db.get(User, uuid.UUID(payload["sub"]))
except (JWTError, KeyError, ValueError):
raise HTTPException(401, "Token yaroqsiz")
if user is None:
raise HTTPException(401, "Foydalanuvchi topilmadi")
return user
@router.get("/me", response_model=UserRead)
async def me(user: User = Depends(get_current_user)):
return user
Authorize tugmasi orqali login qilib, /auth/me ni sinang. 401 — kimligingiz tasdiqlanmadi, 403 — kimligingiz ma'lum, lekin ruxsat yo'q.Yaroqsiz token bilan himoyalangan endpointga kirilsa qaysi status qaytadi?
401 Unauthorized: autentifikatsiya muvaffaqiyatsiz.API lar uchun odatda JWT, an'anaviy saytlar uchun session.
Autentifikatsiya yo'q yoki xato
Autentifikatsiya bor, lekin ruxsat yo'q
JWT da foydalanuvchi identifikatori
JWT amal qilish muddati
Parolni xeshlab, User yaratish.
Parolni tekshirib, JWT berish.
Depends(get_current_user) bilan endpointni yopish.
| Kod | Ma'nosi | Qachon |
|---|---|---|
| 201 | Created | muvaffaqiyatli register |
| 401 | Unauthorized | token yo'q yoki yaroqsiz |
| 403 | Forbidden | admin emas, ruxsat yo'q |
| 409 | Conflict | email allaqachon band |
| 422 | Validation Error | maydon noto'g'ri |
Pastga bosing: Swagger da sinash
/docs da POST /auth/register ni bajaring.Authorize tugmasida email va parol bilan kiring.GET /auth/me ni bajaring: o'z ma'lumotingiz qaytadi.
@router.get("/me")
async def me():
...
@router.get("/me", response_model=UserRead)
async def me(user: User = Depends(get_current_user)):
return user
Token muddati access_token_expire_minutes sozlamasida.
/auth/register endpointini yozing: email band bo'lsa 409, aks holda 201 va parol xeshlansin./auth/login (JWT beradi) va get_current_user bilan himoyalangan /auth/me ni yozing.Identifikatsiya, autentifikatsiya, avtorizatsiya.
bcrypt xesh, verify_password; ochiq saqlanmaydi.
/auth/login token beradi; get_current_user tekshiradi.
Uyga vazifa: register, login va /auth/me endpointlari.
Model, schema, validatsiya, endpointlar
5-hafta · 14-dars