Aller au contenu

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.ts
  • src/modules/auth/services/reauth.service.ts
  • src/modules/auth/controllers/reauth.controller.ts
  • src/modules/auth/mfa/guards/reauth-token.guard.ts

Fichiers livrés

1. reauth.dto.ts (inchangé)

  • ReauthRequestDto : champ password avec @IsString(), @MinLength(1), @ApiProperty
  • ReauthResponseDto : champs reauthToken et expiresAt avec @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

  1. MfaRateLimitGuard : Listé dans le code contract mais non existant — sera implémenté par un autre agent. Non ajouté au controller.

  2. SecurityEventEmitter : Utilise emitSensitiveActionAllowed/emitSensitiveActionBlocked (méthodes existantes) car il n'y a pas de méthodes spécifiques reauth.

  3. Dépendance MfaModule : ReauthService injecte SecurityEventEmitter qui vient de MfaModule. L'AuthModule devra importer MfaModule.

Fichiers hors périmètre identifiés

  • src/modules/auth/auth.module.ts : Doit être mis à jour pour enregistrer ReauthService, ReauthController, ReauthTokenGuard, et importer MfaModule pour SecurityEventEmitter.