Aller au contenu

Authentification & gardes

JWT access + refresh

L'authentification repose sur des JWT (jsonwebtoken) : un access token de courte durée transmis dans l'en-tête Authorization: Bearer <token>, et un refresh token pour obtenir un nouvel access token. Les routes d'auth (/api/auth/*) sont soumises à un rate limiting plus strict (THROTTLER_AUTH_LIMIT).

Un échec d'authentification lève AuthenticationError401, avec un code machine qui pilote la réaction du client (refresh, sélection de workspace, activation…). Voir le contrat complet dans Erreurs API.

Préfixe et workspace actif

  • Toutes les routes sont préfixées par /api (sauf le service de fichiers /_storage/...).
  • Le workspace actif est transmis par l'en-tête X-Workspace-Id et calculé à la requête, jamais persisté. Voir Multi-tenant.

Deux gardes d'authentification

Les gardes vivent dans web/guards/.

RequireWorkspaceGuard (le défaut)

Authentifie et résout un workspace actif. Derrière elle :

  • user.activeWorkspaceId est positionné ;
  • user.hasPerm(...) est significatif.

C'est la garde par défaut pour la quasi-totalité des routes.

AuthenticatedGuard (à utiliser avec parcimonie)

Authentifie uniquement. À réserver aux routes qu'un utilisateur doit atteindre avant d'appartenir à un workspace (ex. POST /workspaces pour créer son premier). Derrière elle :

  • il n'y a pas de workspace actif (user.activeWorkspaceId non défini) ;
  • user.permissions ne contient que la baseline staff (vide pour un non-staff).

Ne supposez pas un workspace derrière AuthenticatedGuard

Un service derrière AuthenticatedGuard ne doit pas supposer que l'appelant a un workspace ou une permission scopée — ce serait un bug. En cas de doute, utilisez RequireWorkspaceGuard.

Autres gardes

Garde Rôle
StaffGuard Vérifie le statut superutilisateur / staff.
AppThrottlerGuard Rate limiting global (@nestjs/throttler), renvoie 429.

Injection de l'utilisateur courant

Dans les contrôleurs, on récupère l'utilisateur via le décorateur @CurrentUser() et on le passe directement au service — jamais de re-fetch via un repository. Côté service, user: User est le dernier paramètre positionnel (voir Style de code).

@Post()
create(@Body() body: CreateFormDto, @CurrentUser() user: User) {
  return this.forms.create(body, user);
}

Autorisation

Une fois authentifié et le workspace résolu, l'autorisation se fait dans le service via user.hasPerm(codename). Un refus lève AuthorizationError403. Voir Permissions (RBAC).