Aller au contenu

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 :

  1. Chiffrement AES-256 du secret TOTP en base — secret2FAChiffre
  2. Blocage IP après tentatives répétées — BloquerIPUseCase
  3. Détection de connexions suspectes (géolocalisation, user-agent inhabituel)
  4. Journal de sécurité consultable par l'utilisateur
  5. Gestion des sessions dans l'UI — liste + révocation unitaire ou globale
  6. Vérification email obligatoire à l'inscription
  7. Tests unitaires sur tous les use cases 2FA