Analyse comparative 2FA — gestionFichePaie / PsychoEnLigne / ProjetESM¶
Contexte¶
Analyse du 2026-06-20 comparant l'implémentation 2FA (TOTP + email +
backup codes) de trois projets DDD du même auteur, pour identifier les
bugs communs et définir une cible pour ProjetESM (qui hérite du meilleur
des deux autres mais aussi de certains de leurs bugs). Fichiers
initialement dans projets/docs/ (dossier hors projet, non versionné) —
centralisés ici le 2026-07-04.
Contenu¶
gestionFichePaie (voir DDD_Module/index) — état initial¶
Backend complet et bien structuré (TOTP via speakeasy, backup codes
bcrypt, audit systématique), frontend avec flux complet. Mais 2 bugs
bloquants :
- Backup code ne complète pas la connexion — VerifierBackupCodeUseCase
retourne {codeValide} sans JWT ; l'utilisateur reste déconnecté même
avec un code valide.
- "Configurer plus tard" contourne le 2FA obligatoire — bouton skip
redirige vers /dashboard sans configuration, aucun garde backend.
Plus : backup codes orphelins (2 lots créés à des étapes différentes),
console.log de debug exposant codes/secrets en prod, secret TOTP non
chiffré en base, Type2FA.SMS déclaré mais jamais implémenté.
PsychoEnLigne — comparaison¶
A corrigé plusieurs points de gestionFichePaie (secret TOTP chiffré
AES-256, blocage IP, détection connexions suspectes, journal de
sécurité, révocation granulaire de sessions, code propre sans logs
debug, tests unitaires complets), mais introduit ses propres bugs
2FA différents :
- Backup code envoyé au mauvais flow — TwoFactorForm.tsx envoie le
code backup (format XXXX-XXXX-XXXX) via le flow TOTP standard, rejeté
immédiatement par la regex /^\d{6}$/. Pire que gestionFichePaie : ici
la validation échoue totalement, pas seulement la connexion finale.
- handleResendCode n'appelle aucune API — cooldown UI affiché sans
jamais appeler EnvoyerCode2FAUseCase.
- Mêmes backup codes orphelins (même cause : génération avant activation).
ProjetESM — synthèse intermédiaire, cible définie¶
Hérite des fonctionnalités avancées de PsychoEnLigne (blocage IP, détection suspectes, journal sécurité, sessions UI) mais porte encore les bugs non résolus des deux autres (secret TOTP en clair, backup code sans JWT, logs debug, backup codes orphelins, zéro test unitaire auth).
Corrections cibles définies (aucun des 3 projets ne les a toutes) :
1. VerifierBackupCodeUseCase doit retourner des JWT comme
Verifier2FAUseCase (générer paire de tokens + session, pas juste
valider le code).
2. authStore.verifyBackupCode (frontend) doit poser
isAuthenticated: true + stocker les tokens après validation réussie.
3. Chiffrement AES-256 du secret TOTP au repos (secret2FAChiffre,
clé dans TOTP_ENCRYPTION_KEY).
4. Supprimer les console.log de debug.
5. Corriger les backup codes orphelins — Generer2FASecretUseCase doit
retourner les codes en clair sans les stocker ; seul
Activer2FAUseCase doit persister les codes hashés, après confirmation.
6. Tests unitaires sur tous les use cases 2FA (modèle PsychoEnLigne).
7. Supprimer Type2FA.SMS du shared-kernel ou implémenter un vrai ServiceSMS.
Manque commun aux 3 projets¶
"Se souvenir de cet appareil" — le 2FA est exigé à chaque connexion sans exception dans les 3 projets ; aucun n'a de token de confiance (cookie httpOnly, ~30 jours) pour éviter de le redemander à chaque fois sur un appareil déjà vérifié.
Décision / Conclusion¶
Le bug "backup code ne connecte pas réellement l'utilisateur" est présent sous une forme ou une autre dans les 3 projets — c'est le point le plus prioritaire à corriger partout, avant tout autre travail 2FA. ProjetESM sert de cible de convergence : reprendre les points forts sécuritaires de PsychoEnLigne + corriger le bug de connexion backup code qu'aucun des trois n'a résolu correctement.
À faire¶
- Vérifier si ProjetESM a depuis implémenté les 7 corrections listées (analyse datée du 2026-06-20 — statut à revérifier).
- Envisager de back-porter les corrections vers gestionFichePaie et PsychoEnLigne une fois validées sur ProjetESM.
- Implémenter "se souvenir de cet appareil" si le besoin se confirme sur l'un des 3 projets.
Liens connexes¶
- ProjetESM/architecture/systeme-rbac-permissions — système d'auth de ProjetESM concerné par cette cible
- shared/flow-connexion-auth — flow auth transversal (login, 2FA, refresh JWT) déjà documenté
- DDD_Module/index — projet gestionFichePaie
- PsychoEnLigne/index — projet PsychoEnLigne (si index existant)