""" Utilitaires pour l'authentification et les tokens JWT. """ from datetime import datetime, timedelta 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.utcnow() + expires_delta else: expire = datetime.utcnow() + 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