xpeditis2.0/docs/features/auth.md
2026-05-14 21:11:54 +02:00

141 lines
3.3 KiB
Markdown

# 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=<pathname>`.
---
## 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
```