3.3 KiB
3.3 KiB
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→ callbackGOOGLE_CALLBACK_URL - Microsoft :
GET /api/v1/auth/microsoft→ callbackMICROSOFT_CALLBACK_URL
Configuration dans .env :
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
@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=<pathname>.
Variables d'environnement
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