feat: 6.1 Создать модуль app/core/jwt.py
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from typing import Any
|
||||
from uuid import uuid4
|
||||
|
||||
from jose import JWTError, jwt
|
||||
|
||||
from app.config import settings
|
||||
|
||||
|
||||
# формирует JWT с claim'ами:
|
||||
# sub (email или id пользователя),
|
||||
# iat,
|
||||
# exp,
|
||||
# jti (случайный идентификатор),
|
||||
# typ: "access",
|
||||
# подписывает HS256 секретом из настроек;
|
||||
def create_access_token(sub: str, ttl_min: int | None = None) -> str:
|
||||
now = datetime.now(timezone.utc)
|
||||
ttl = ttl_min if ttl_min is not None else settings.access_token_ttl_min
|
||||
payload: dict[str, Any] = {
|
||||
"sub": sub,
|
||||
"iat": now,
|
||||
"exp": now + timedelta(minutes=ttl),
|
||||
"jti": uuid4().hex,
|
||||
"typ": "access",
|
||||
}
|
||||
return jwt.encode(payload, settings.jwt_secret, algorithm=settings.jwt_algorithm)
|
||||
|
||||
|
||||
# decode_token(token) – декодирует и проверяет подпись/срок,
|
||||
# при ошибке бросает `ValueError` с понятным сообщением.
|
||||
def decode_token(token: str) -> dict[str, Any]:
|
||||
try:
|
||||
return jwt.decode(
|
||||
token, settings.jwt_secret, algorithms=[settings.jwt_algorithm]
|
||||
)
|
||||
except JWTError as exc:
|
||||
raise ValueError(f"Invalid token: {exc}") from exc
|
||||
Reference in New Issue
Block a user