141 lines
3.3 KiB
Markdown
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
|
|
```
|