# 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
```
