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 AuthenticationError → 401, 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-Idet 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.activeWorkspaceIdest 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.activeWorkspaceIdnon défini) ; user.permissionsne 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 AuthorizationError → 403. Voir Permissions (RBAC).