Aller au contenu

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 connexionVerifierBackupCodeUseCase 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 flowTwoFactorForm.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