# Authentification & Autorisation --- ## Mécanismes d'authentification ### 1. JWT (principal) - **Access token** : 15 minutes, signé avec `JWT_SECRET` - **Refresh token** : 7 jours, rotation automatique - **Stockage frontend** : localStorage + cookie `accessToken` (pour le middleware Next.js) #### Flow login ``` POST /api/v1/auth/login { email, password } → Vérification hash Argon2 → Brute-force check (3 échecs → backoff exponentiel) → Retourne { accessToken, refreshToken, user } ``` #### Refresh ``` POST /api/v1/auth/refresh { refreshToken } → Nouveau accessToken + refreshToken (rotation) ``` ### 2. OAuth2 - **Google** : `GET /api/v1/auth/google` → callback `GOOGLE_CALLBACK_URL` - **Microsoft** : `GET /api/v1/auth/microsoft` → callback `MICROSOFT_CALLBACK_URL` Configuration dans `.env` : ```bash GOOGLE_CLIENT_ID=... GOOGLE_CLIENT_SECRET=... MICROSOFT_CLIENT_ID=... MICROSOFT_CLIENT_SECRET=... ``` ### 3. API Keys Authentification alternative au JWT pour intégrations tierces. ``` Header: x-api-key: xped_xxxxxxxxxxxxxxxx ``` Gestion via `GET/POST /api/v1/api-keys`. Les clés sont hashées avec Argon2 — seul le préfixe est stocké en clair. --- ## RBAC — Rôles et permissions | Rôle | Description | Accès | |------|-------------|-------| | ADMIN | Administrateur de l'organisation | Tout | | MANAGER | Gestionnaire | Bookings, dashboard, utilisateurs (no admin) | | USER | Utilisateur standard | Recherche, création bookings | | VIEWER | Lecture seule | Dashboard, liste bookings | | CARRIER | Portail carrier | Accepter/rejeter CSV bookings assignés | ### Décorateurs ```typescript @Roles('ADMIN', 'MANAGER') // Restreindre à des rôles @Public() // Route publique (pas de JWT requis) @CurrentUser() // Injecter l'utilisateur courant ``` --- ## Vérification email ``` POST /api/v1/auth/register → Email de vérification envoyé (token 24h) POST /api/v1/auth/verify-email?token=xxx → Marque l'email comme vérifié ``` --- ## Réinitialisation de mot de passe ``` POST /api/v1/auth/forgot-password { email } → Email avec token (1h, table password_reset_tokens) POST /api/v1/auth/reset-password { token, newPassword } → Nouveau mot de passe hashé Argon2 ``` --- ## Invitations Les admins peuvent inviter des utilisateurs dans leur organisation : ``` POST /api/v1/invitations { email, role } → Email d'invitation avec token (24h, table invitation_tokens) GET /api/v1/invitations/accept?token=xxx → Crée l'utilisateur avec le rôle assigné ``` --- ## Protection des routes (middleware Next.js) `apps/frontend/middleware.ts` vérifie le cookie `accessToken` avant chaque requête. **Routes publiques** (pas de redirection) : - Exactes : `/`, pages légales - Par préfixe : `/login`, `/register`, `/carrier`, `/about`, `/blog`, `/pricing`, etc. Toutes les autres routes redirigent vers `/login?redirect=`. --- ## Variables d'environnement ```bash JWT_SECRET=your-super-secret-jwt-key JWT_ACCESS_EXPIRATION=15m JWT_REFRESH_EXPIRATION=7d GOOGLE_CLIENT_ID= GOOGLE_CLIENT_SECRET= GOOGLE_CALLBACK_URL=http://localhost:4000/api/v1/auth/google/callback MICROSOFT_CLIENT_ID= MICROSOFT_CLIENT_SECRET= MICROSOFT_CALLBACK_URL=http://localhost:4000/api/v1/auth/microsoft/callback BCRYPT_ROUNDS=12 SESSION_TIMEOUT_MS=7200000 ```