""" Utilitaires pour l'authentification et les tokens JWT. """ from datetime import datetime, timedelta, timezone from typing import Optional from jose import JWTError, jwt import bcrypt from .config import settings def hash_password(password: str) -> str: """Hacher un mot de passe avec bcrypt""" salt = bcrypt.gensalt() return bcrypt.hashpw(password.encode(), salt).decode() def verify_password(plain_password: str, hashed_password: str) -> bool: """Vérifier un mot de passe""" return bcrypt.checkpw( plain_password.encode(), hashed_password.encode() ) def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str: """Créer un token JWT""" to_encode = data.copy() if expires_delta: expire = datetime.now(timezone.utc) + expires_delta else: expire = datetime.now(timezone.utc) + timedelta( minutes=settings.access_token_expire_minutes ) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode( to_encode, settings.secret_key, algorithm=settings.algorithm ) return encoded_jwt def verify_token(token: str) -> Optional[dict]: """Vérifier et décoder un token JWT""" try: payload = jwt.decode( token, settings.secret_key, algorithms=[settings.algorithm] ) return payload except JWTError: return None