02-ce-que-je-construis/specs/auth-compte.md

Authentification, compte et 2FA

Spécification du cœur fonctionnel actuel de telaria : comptes utilisateurs, connexion, vérification d'e-mail, mot de passe oublié, double authentification (2FA) et accès API par token. Reflète l'implémentation existante (tickets CDX-108..115) et le schéma cible de la phase de clean. Statut : spec de référence (doc-design).


1. Objectif et périmètre

telaria est, à ce stade, une application centrée sur le compte utilisateur (le reste — CMS, doc web, IA — vient se greffer dessus). Cette spec documente l'authentification, la gestion de compte, la 2FA et l'accès API.

Dans le périmètre : inscription, vérification d'e-mail, connexion, mot de passe oublié, 2FA, rôles/autorisations, token API, sécurité transverse (CSRF, rate limiting, hardening session). Hors périmètre : CMS (telaria-cms.md), backoffice générique (telaria-admin.md), IA (ia-*.md).


2. Modèle de données (cible)

User

Implémente UserInterface, PasswordAuthenticatedUserInterface, TwoFactorInterface (scheb 2FA e-mail), TrustedDeviceInterface.

Champ Type Notes
id int PK
email string identifiant de connexion ; index unique en base (au-delĂ  du UniqueEntity applicatif)
password string haché (algorithme auto Symfony)
roles json ROLE_USER par défaut, ROLE_ADMIN pour le backoffice
isVerified bool e-mail vérifié
apiToken string(128) nullable hash SHA-512 (128 hex) — voir §8
is2faEnabled bool 2FA activée par l'utilisateur
authCode string nullable code e-mail 2FA en cours
totpSecret string nullable réservé au TOTP (prévu plus tard) — champ conservé même si inactif
trustedVersion int versioning des appareils de confiance (trusted-device)

ResetPasswordRequest

Entité du bundle SymfonyCasts ResetPassword (jeton, expiration, user).

Deltas de migration (phase clean, VPS-gated)

  • Retirer username (+ index UNIQ_IDENTIFIER_USERNAME, accesseurs, usage fixtures) — vestige, la connexion se fait par e-mail.
  • api_token : VARCHAR(255) → VARCHAR(128) (l'entitĂ© dĂ©clare 128 ; la migration Version20251209174030 avait créé 255 → sinon doctrine:schema:validate Ă©choue).
  • Ajouter l'index unique sur user.email (aucune contrainte DB ne le garantit aujourd'hui).
  • DROP TABLE recipe + category (tables orphelines du dĂ©mo supprimĂ©).

Workflow : modifier entité + fixtures, puis sur le VPS doctrine:migrations:diff + migration manuelle pour les tables orphelines, puis doctrine:schema:validate.


3. Inscription et vérification d'e-mail

  • RegistrationController : formulaire d'inscription (route register), crĂ©ation du compte (isVerified=false).
  • EmailVerifier + SymfonyCasts VerifyEmail : envoi d'un lien signĂ© ; routes verify/email (confirmation) et verify/success.
  • Ă€ la vĂ©rification : isVerified=true.

4. Connexion

  • SecurityController : connexion par e-mail + mot de passe, CSRF activĂ©, user provider Doctrine sur email.
  • Redirection post-login par rĂ´le (v0.5.0) : ROLE_ADMIN → back-office /admin ; ROLE_USER (lecteur) → espace de lecture /lecteur. Cf. §7.
  • Session durcie en production (.env.prod.dist, cf. CDX-114).

5. Mot de passe oublié

  • ResetPasswordController (SymfonyCasts ResetPassword) : route /password (demande) et /reset/{token} (rĂ©initialisation), jeton Ă  expiration.

6. Double authentification (2FA)

  • Actif : scheb/2fa-email (code envoyĂ© par e-mail ; authCode).
  • Trusted device : scheb/2fa-trusted-device (trustedVersion) — ne pas redemander la 2FA sur un appareil de confiance.
  • TOTP : prĂ©vu (totpSecret rĂ©servĂ©) ; scheb/2fa-totp Ă  installer le moment venu.
  • Pilotage utilisateur : route /2fa/toggle (activation/dĂ©sactivation, is2faEnabled).

7. RĂ´les et autorisations

  • ROLE_USER (dĂ©faut) — lecteur : accès Ă  l'espace de lecture de la veille /lecteur (cf. ia-veille.md ; suivi lu/non-lu par utilisateur, filtres/tri, arborescence des sources). ROLE_ADMIN (backoffice).
  • Firewall /admin rĂ©servĂ© Ă  ROLE_ADMIN (CDX-109).
  • Voters pour la propriĂ©tĂ© des ressources (CDX-113).
  • CSRF sur les actions sensibles (suppressions — CDX-110).

7.1 Comptes lecteur — créés par l'admin (v0.5.0)

  • En V1, les comptes lecteur (ROLE_USER) sont créés par l'administrateur via /admin/utilisateurs (UserController) — aujourd'hui crĂ©ation + liste (index + new) ; Ă©dition/suppression Ă  venir. Pas d'auto-inscription ouverte pour l'espace lecteur.
  • La vitrine publique /veille (billets validĂ©s, lecture anonyme) reste conservĂ©e et distincte de l'espace lecteur authentifiĂ© /lecteur.
  • Point ouvert : chantier « gestion des utilisateurs » (auto-inscription + validation) actĂ© au backlog — cf. §13.

8. Accès API (token)

  • Authentification par token : APIAuthenticator valide le token en comparant son hash SHA-512 Ă  apiToken (le token en clair n'est jamais stockĂ©).
  • Header canonique = X-Auth-Token (exclusif) : l'authenticator ne se dĂ©clenche que sur ce header (supports() / authenticate(), vĂ©rifiĂ© Lead inbox codexia #47, src/Security/APIAuthenticator.php). Bearer n'est pas acceptĂ© (un header Bearer ne passe pas supports() → 401). Le schĂ©ma Bearer autrefois Ă©voquĂ© dans cette spec est obsolète — pas « les deux ». Un Ă©ventuel support Bearer serait une Ă©volution de l'authenticator, pas l'Ă©tat actuel. Pas-Ă -pas : tutos/securite-token-api-symfony.md.
  • GĂ©nĂ©ration : commande app:user:generate-token (CDX-108) — affiche le token en clair une seule fois, stocke le hash.
  • Endpoints : /api, /me (profil courant), /check/email (disponibilitĂ©).
  • Rate limiting sur l'API (CDX-111).
  • Le modèle actuel est un token opaque hachĂ© (simple, robuste). OAuth 2.1 / JWT (cf. rfc/README.md, en stand-by) restent une Ă©volution possible, non requise Ă  ce stade.

9. Sécurité transverse

  • Rate limiting : connexion, contact, API (symfony/rate-limiter, CDX-111).
  • Uploads sĂ©curisĂ©s : vĂ©rification du type MIME rĂ©el + anti path traversal (FileUploader, CDX-112).
  • CSRF, hardening session (prod), hachage des mots de passe et des tokens.

10. RGPD et accessibilité

  • DonnĂ©es personnelles : e-mail (identifiant). Minimisation : pas de username superflu. Voir la veille RGPD.
  • AccessibilitĂ© RGAA AA des formulaires (inscription, connexion, reset, 2FA) : labels explicites, erreurs reliĂ©es (aria-describedby), focus visible.

11. Tests (cas concrets)

  • UnicitĂ© e-mail : deux comptes avec le mĂŞme e-mail → refus (contrainte DB et UniqueEntity).
  • Token API : un token valide (hash SHA-512 correspondant) authentifie ; un token inconnu → 401 ; le clair n'est jamais persistĂ©.
  • Firewall admin : un ROLE_USER sur /admin → refus (403/redirection).
  • Reset : jeton expirĂ© → refus ; jeton valide → changement de mot de passe.
  • 2FA : avec is2faEnabled=true, la connexion exige le code e-mail ; un appareil de confiance (trustedVersion courant) ne le redemande pas.
  • Rate limiting : dĂ©passement sur login/API/contact → rĂ©ponse de limitation.
  • VĂ©rification e-mail : lien signĂ© valide → isVerified=true ; lien altĂ©rĂ© → refus.

12. Production documentaire d'accompagnement (doctrine)

Concept introduit Forme Emplacement Statut
2FA en Symfony (scheb : e-mail, TOTP, trusted device) Tuto/fiche 2fa-symfony-scheb.md ✅ produit (e-mail + trusted ; TOTP prévu)
Auth API par token haché (SHA-512) Tuto securite-token-api-symfony.md ✅ produit (implé confirmée Lead, inbox codexia #44)

13. Points ouverts

  1. TOTP : quand activer scheb/2fa-totp (le champ totpSecret est déjà réservé).
  2. Évolution API : rester en token opaque haché, ou passer à OAuth 2.1 / JWT plus tard (RFC en stand-by).
  3. Politique de durée de vie / rotation des tokens API.
  4. Gestion des utilisateurs lecteur : en V1 les comptes ROLE_USER sont créés par l'admin (cf. §7.1). Chantier ouvert : auto-inscription + validation (workflow d'enrôlement public pour l'espace lecteur).

Documents liés


Implémentation

Aspect Localisation
Bundle principal telaria-app — domaine auth/compte
Entités src/Entity/User.php, src/Entity/ResetPasswordRequest.php dans telaria-app
Controllers src/Controller/RegistrationController.php, src/Controller/SecurityController.php, src/Controller/ResetPasswordController.php
Sécurité src/Security/APIAuthenticator.php, src/Security/Voter/
Commandes CLI src/Command/UserGenerateTokenCommand.php (génération token SHA-512)
Config config/security.yaml, config/packages/scheb_2fa.yaml
Tests tests/Controller/RegistrationControllerTest.php (Ă  documenter)

Historique des décisions

Version Date Décision
1.0 2026-06-14 Version initiale — première formalisation du versioning des specs.
— 2026-06-05 Spec alignée sur l'implémentation réelle (tickets CDX-108..115). Confirmation header canonique X-Auth-Token exclusif (Lead inbox codexia #47).
— 2026-06-05 Redirection post-login par rôle ajoutée : ROLE_ADMIN → /admin, ROLE_USER → /lecteur (v0.5.0).
— 2026-06-05 Gestion des utilisateurs lecteur : comptes ROLE_USER créés par admin uniquement en V1, pas d'auto-inscription publique.

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #