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

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 → callback GOOGLE_CALLBACK_URL
  • Microsoft : GET /api/v1/auth/microsoft → callback MICROSOFT_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