Skip to content

2FA (TOTP) — authentification à deux facteurs pour les comptes locaux #309

Description

@ronan-develop

Description

Permettre à un utilisateur d'activer une authentification à deux facteurs (2FA) par TOTP (compatible Google Authenticator, FreeOTP, Authy, etc.) pour renforcer la sécurité de son compte, en plus du mot de passe classique.

Ce ticket est distinct de #303 (« Connexion sécurisée ») qui couvre la délégation complète de l'authentification à un fournisseur externe (OAuth2/OpenID Connect via Google, Proton, Facebook — plus aucun mot de passe stocké en base). Ici, il s'agit d'ajouter un second facteur au-dessus de l'authentification par mot de passe existante (LexikJWTAuthenticationBundle + form_login), pour les comptes qui ne passent pas par un provider externe.

Reprend et remplace l'ancienne issue #39 (fermée sans implémentation) avec un périmètre resserré, en tenant compte de l'auth actuelle (JWT + session double firewall, src/Entity/User.php, config/packages/security.yaml).

Piste de correction

  • Bundle recommandé : scheb/2fa-bundle (support TOTP natif, intégration Symfony Security éprouvée) plutôt qu'une implémentation maison
  • Ajouter un champ de secret TOTP chiffré sur User (jamais en clair en base) + un flag d'activation
  • Flow d'activation : génération du secret, affichage d'un QR code, vérification d'un premier code avant activation effective
  • Flow de connexion : après succès du mot de passe, si 2FA activée, exiger le code TOTP avant délivrance du JWT / de la session
  • Codes de secours (recovery codes) à générer à l'activation, pour le cas de perte de l'appareil TOTP
  • Vérifier l'articulation avec les deux firewalls existants (login API stateless JWT et web session) : le second facteur doit s'appliquer aux deux parcours de connexion

Points à clarifier avant implémentation

  • Le second facteur doit-il aussi s'appliquer à une future connexion OAuth (Connexion sécurisée #303), ou seulement à l'authentification par mot de passe local ?
  • Où et comment les codes de secours sont-ils communiqués/stockés côté utilisateur ?

Critères d'acceptation

  • Un utilisateur peut activer/désactiver la 2FA TOTP depuis son compte
  • Le secret TOTP est stocké chiffré, jamais en clair
  • Un QR code est fourni à l'activation, avec vérification d'un code avant activation effective
  • La connexion (API JWT et web session) exige le code TOTP si la 2FA est active
  • Des codes de secours sont générés et utilisables en cas de perte de l'appareil
  • Tests : activation, connexion avec 2FA active, échec de code invalide, utilisation d'un code de secours, désactivation

Zone concernée

Auth (JWT, sécurité) + Backend

Effort estimé

M — plusieurs jours

Metadata

Metadata

Assignees

No one assigned

    Labels

    featureNouvelle fonctionnalitésecuritéCorrectif de sécurité

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions