PD-238 — Livrable Agent Developer : Reauth Module¶
Tâche 2 du manifest de décomposition Date : 2026-02-06 Agent : agent-developer (Claude)
Périmètre¶
src/modules/auth/dto/reauth.dto.tssrc/modules/auth/services/reauth.service.tssrc/modules/auth/controllers/reauth.controller.tssrc/modules/auth/mfa/guards/reauth-token.guard.ts
Fichiers livrés¶
1. reauth.dto.ts (inchangé)¶
ReauthRequestDto: champpasswordavec@IsString(),@MinLength(1),@ApiPropertyReauthResponseDto: champsreauthTokenetexpiresAtavec@ApiProperty- Conforme au code contract
2. reauth.service.ts (corrigé)¶
Corrections apportées au skeleton existant :
| Modification | Détail |
|---|---|
| Erreurs typées | Remplacé UnauthorizedException par MfaReauthFailedError (ERR-238-REAUTH-FAILED) pour cohérence avec MfaExceptionFilter |
| Try-catch global | Ajouté catch pour erreurs internes → MfaInternalError (ERR-238-INTERNAL) |
| Événements security | emitReauthSuccess() appelle securityEventEmitter.emitSensitiveActionAllowed(), emitReauthFailed() appelle securityEventEmitter.emitSensitiveActionBlocked() |
| Imports | Ajouté MfaReauthFailedError, MfaInternalError, retiré UnauthorizedException |
3. reauth.controller.ts (corrigé)¶
| Modification | Détail |
|---|---|
@UseFilters(MfaExceptionFilter) | Ajouté au niveau classe pour convertir MfaManagementError en réponses HTTP standardisées |
Type JwtPayload | Interface locale au lieu d'importer OidcJwtPayload (pattern du projet) |
4. reauth-token.guard.ts (nouveau)¶
Implémente CanActivate avec la logique suivante : - Extrait header X-Reauth-Token - Vérifie signature JWT via JwtService.verify() (même clé que tokens principaux) - Vérifie purpose === 'reauth' - Vérifie sub correspond au userId du JWT principal - Vérifie exp non dépassé (via JwtService.verify qui valide l'expiration) - Toute erreur → MfaUnauthorizedReauthError (ERR-238-UNAUTHORIZED-REAUTH, HTTP 401)
Conformité invariants¶
| Invariant | Statut |
|---|---|
| INV-238-06 | Conforme — ReauthTokenGuard prêt pour POST /user/mfa/disable |
| INV-238-07 | Conforme — ReauthTokenGuard prêt pour POST /user/mfa/recovery/regenerate |
| INV-238-12 | Conforme — JWT signé avec sub, purpose=reauth, exp=5min |
| INV-238-15 | Conforme — OidcJwtAuthGuard en amont |
| Password JAMAIS loggé | Conforme — Aucun log ne contient le password |
Hypothèses documentées¶
-
MfaRateLimitGuard : Listé dans le code contract mais non existant — sera implémenté par un autre agent. Non ajouté au controller.
-
SecurityEventEmitter : Utilise
emitSensitiveActionAllowed/emitSensitiveActionBlocked(méthodes existantes) car il n'y a pas de méthodes spécifiques reauth. -
Dépendance MfaModule :
ReauthServiceinjecteSecurityEventEmitterqui vient deMfaModule. L'AuthModuledevra importerMfaModule.
Fichiers hors périmètre identifiés¶
src/modules/auth/auth.module.ts: Doit être mis à jour pour enregistrerReauthService,ReauthController,ReauthTokenGuard, et importerMfaModulepourSecurityEventEmitter.