# Authentification & Sécurité (PR-2) Ce document décrit les mécanismes d'authentification sécurisée mis en place sur le backend Veza. ## 1. Mécanisme JWT L'authentification repose sur des tokens JWT (JSON Web Tokens) signés en **HS256**. ### Structure du Token * **Header**: * `alg`: `HS256` (Strictement vérifié, `none` ou `RS256` rejetés) * `typ`: `JWT` * **Payload (Claims)**: * `sub` (Subject): UUID de l'utilisateur * `iss` (Issuer): `veza-api` (Vérifié strictement) * `aud` (Audience): `veza-app` (Vérifié strictement) * `exp` (Expiration): Timestamp Unix * `iat` (Issued At): Timestamp Unix * `token_version`: Entier (Utilisé pour la révocation) * `role`: Rôle de l'utilisateur (`user`, `admin`, etc.) ## 2. Révocation de Token (`TokenVersion`) Pour permettre la révocation immédiate des tokens (stateless) sans blacklist Redis complexe, nous utilisons le concept de `TokenVersion`. 1. Chaque utilisateur possède un champ `token_version` en base de données (entier, défaut 1). 2. Lors du login, le JWT généré inclut ce `token_version` dans ses claims. 3. À chaque requête authentifiée, le middleware : * Valide la signature du JWT. * Charge l'utilisateur depuis la DB. * **Compare** `claim.token_version` avec `db_user.token_version`. * Si différent : **Rejet immédiat (401 Token revoked)**. **Cas d'usage**: * Logout "Global" : On incrémente `db_user.token_version`. Tous les anciens tokens deviennent invalides instantanément. * Changement de mot de passe : Incrémentation automatique. * Compte compromis : Incrémentation manuelle par admin. ## 3. Sécurité Renforcée (P1) ### Validation Stricte Le backend rejette tout token qui ne respecte pas strictement : * `alg`: Doit être `HS256`. * `iss`: Doit correspondre à la config (`JWT_ISSUER` ou défaut `veza-api`). * `aud`: Doit correspondre à la config (`JWT_AUDIENCE` ou défaut `veza-app`). ### Headers requis * `Authorization: Bearer ` ## 4. Tests et Vérification Pour vérifier la robustesse de l'auth : * Tenter de changer l'algo en `none` -> 401. * Modifier l'audience -> 401. * Utiliser un token d'une version n-1 -> 401. Voir `tests/verify_auth.sh` pour les tests automatisés.