Analyse comparative 2FA — PsychoEnLigne vs gestionFichePaie¶
Date : 2026-06-20
Projets analysés :
- /home/kanmaber/projets/PsychoEnLigne
- /home/kanmaber/projets/gestionFichePaie
Voir aussi : 20260620_1200_analyse-2fa-gestionFichePaie.md pour le détail du premier projet.
Ce que PsychoEnLigne a en plus ou a corrigé¶
Backend¶
| Fonctionnalité | gestionFichePaie | PsychoEnLigne |
|---|---|---|
| Secret TOTP au repos | Plain text deuxFacteursSecret |
AES-256 chiffré secret2FAChiffre |
| Blocage d'IP | ❌ absent | ✅ BloquerIPUseCase + DebloquerIPUseCase |
| Détection connexions suspectes | ❌ absent | ✅ DetecterConnexionsSuspectesUseCase |
| Journal de sécurité | ❌ absent | ✅ ObtenirLogsSecuriteUseCase |
| Révocation granulaire sessions | partielle | ✅ RevoquerSessionUseCase, RevoquerToutesSessionsUseCase, RevoquerTousTokensUseCase |
| Vérification email à l'inscription | ❌ absent | ✅ VerifierEmailUseCase |
console.log debug en prod |
✅ présents (codeDB, secret TOTP) | ✅ absents — code propre |
| Tests unitaires | partiels | ✅ complets sur tous les use cases |
Frontend¶
| Fonctionnalité | gestionFichePaie | PsychoEnLigne |
|---|---|---|
| Bypass "Configurer plus tard" | ❌ bouton skip vers /dashboard |
✅ absent — seulement "Annuler" (navigate(-1)) |
| Gestion sessions dans l'UI | ❌ absent | ✅ SessionsSettingsPage + SessionsManager — voir et révoquer ses sessions actives |
| Sécurité dans l'UI | ❌ absent | ✅ SecuritySettingsPage avec journal d'accès consultable |
| Architecture frontend | module plat | ✅ DDD complet (domain/entities, value-objects, ports) |
| Historique de connexion | ❌ absent | ✅ HistoryPage connectée à ObtenirHistoriqueUseCase |
Problèmes persistants dans PsychoEnLigne¶
1. 🔴 CRITIQUE — Backup codes cassés différemment¶
Dans TwoFactorForm.tsx:95, handleBackupSubmit appelle :
await verify2FA({ sessionId, code, methode: '2FA_TOTP' })
Le code backup (12 chars alphanumériques, format XXXX-XXXX-XXXX) est envoyé dans le flow TOTP standard. Le backend Service2FA.validerCodeTOTP le rejette immédiatement sur le test !/^\d{6}$/.test(codeNettoye).
Les backup codes échouent toujours et complètement — ni validation correcte, ni connexion. Aucune route vers VerifierBackupCodeUseCase qui existe pourtant en backend.
Comparaison : dans gestionFichePaie, le backup code est envoyé au bon use case (
verifyBackupCode) et la validation fonctionne, mais ne complète pas la connexion (pas de JWT retourné). PsychoEnLigne ne fait même pas la validation correctement.
2. 🔴 CRITIQUE — handleResendCode n'appelle aucune API¶
// TwoFactorForm.tsx:101
async function handleResendCode() {
if (!userId || cooldown > 0) return
setIsSending(true)
try {
setCooldown(60) // ← seulement un cooldown, aucun appel API
} finally {
setIsSending(false)
}
}
Le bouton "Renvoyer le code" email affiche un cooldown de 60s mais n'envoie rien. EnvoyerCode2FAUseCase existe en backend mais n'est jamais appelé depuis ce formulaire.
Comparaison : gestionFichePaie appelle correctement
twoFactorApi.sendCode(effectiveUserId).
3. 🟠 Backup codes orphelins — même problème, même source¶
Generer2FASecretUseCase (lignes 94-103) crée 10 backup codes en base avant activation. Activer2FAUseCase (lignes 148-160) en génère et sauvegarde 10 autres au moment de l'activation. Un utilisateur qui complète le flow TOTP a 20 backup codes actifs en base, les 10 premiers orphelins car jamais présentés à l'utilisateur.
Manques communs aux deux projets¶
| Manque | Impact |
|---|---|
| Backup code login non fonctionnel | Bloquant — le mécanisme de secours est inutilisable dans les deux cas |
| "Se souvenir de cet appareil" | 2FA exigé à chaque connexion sans exception |
| SMS déclaré dans l'enum mais non implémenté | Confusion / dette technique |
| Secret TOTP non chiffré | gestionFichePaie uniquement — risque si DB compromise |
Fonctionnalités présentes dans PsychoEnLigne à back-porter dans gestionFichePaie¶
Si gestionFichePaie monte en charge ou en criticité, ces éléments devraient être portés :
- Chiffrement AES-256 du secret TOTP en base —
secret2FAChiffre - Blocage IP après tentatives répétées —
BloquerIPUseCase - Détection de connexions suspectes (géolocalisation, user-agent inhabituel)
- Journal de sécurité consultable par l'utilisateur
- Gestion des sessions dans l'UI — liste + révocation unitaire ou globale
- Vérification email obligatoire à l'inscription
- Tests unitaires sur tous les use cases 2FA