BetterAuth Symfony : Repenser l'Authentification pour Symfony 7


L’authentification en Symfony est puissante mais verbeuse. Le Security component est flexible — trop, parfois. Configurer OAuth, 2FA, magic links et la gestion de sessions demande des dizaines de fichiers, de la config YAML imbriquée, et une connaissance fine du système de firewalls.

J’ai créé BetterAuth Symfony pour résoudre ce problème : un bundle qui installe un système d’authentification complet en une commande, avec tous les patterns modernes prêts à l’emploi.

Le problème avec l’auth Symfony standard

Symfony Security est un excellent composant. Mais pour un projet qui a besoin d’auth complète, il faut :

  1. Configurer le firewall dans security.yaml (40+ lignes)
  2. Créer les entités User, Session, RefreshToken
  3. Écrire les contrôleurs login, register, logout, forgot-password
  4. Intégrer un provider OAuth (Google, GitHub, etc.)
  5. Ajouter la 2FA avec un bundle tiers
  6. Gérer les tokens de vérification email
  7. Implémenter la gestion de sessions

Ça représente facilement 2-3 jours de travail pour un développeur expérimenté. Et c’est du code qu’on réécrit à chaque projet avec des variations mineures.

La solution : un wizard d’installation

BetterAuth Symfony propose un wizard interactif qui configure tout en 5 minutes :

php bin/console better-auth:install

Le wizard pose 3 questions :

  1. Stratégie d’ID : UUID v7 (recommandé) ou INT auto-increment
  2. Mode d’auth : API (tokens Paseto V4), Session (stateful), ou Hybride
  3. Providers OAuth : Google, GitHub, Facebook, etc.

Puis il génère automatiquement :

  • Les entités Doctrine (User, Session, RefreshToken)
  • Les contrôleurs d’authentification
  • Les migrations de base de données
  • La configuration security.yaml
  • Les variables d’environnement dans .env

Choix techniques

Paseto V4 plutôt que JWT

Pour le mode API, j’ai choisi Paseto V4 au lieu de JWT. Pourquoi ?

  • Pas de confusion d’algorithme : Paseto impose l’algorithme (pas de alg: none possible)
  • Sécurité par défaut : chiffrement XChaCha20-Poly1305, pas de configuration nécessaire
  • Tokens plus courts : payload réduit, moins de bande passante

Le trade-off : moins de bibliothèques client disponibles que JWT. Mais pour une API PHP consommée par un frontend JavaScript, les librairies existent et sont matures.

Multi-tenant natif

Le bundle supporte les organisations, équipes, membres et invitations out of the box :

// Les entités Organization, Team, Member sont générées
// L'arbre de permissions est configuré automatiquement

$user->getOrganizations();         // Liste des orgas
$user->getCurrentTeam();           // Équipe active
$team->getMembers();               // Membres de l'équipe
$team->invite('new@example.com');  // Invitation

Ce pattern est inspiré de ce que fait Laravel avec ses packages d’auth (Jetstream/Breeze), adapté aux conventions Symfony.

30+ endpoints pré-construits

Le bundle génère des endpoints couvrant 6 domaines fonctionnels :

DomaineEndpointsExemples
Auth basique4register, login, logout, refresh
Sessions3list, revoke, revoke-all
2FA/TOTP3enable, verify, disable
Magic Links2request, verify
Email2send-verification, verify
OAuth2authorize, callback (× n providers)

Chaque endpoint suit les conventions Symfony et s’intègre avec API Platform pour la documentation OpenAPI automatique.

Architecture interne

Le bundle suit une architecture en couches stricte :

  • Couche Domain : Value Objects (Email, Token), règles de validation
  • Couche Application : Services d’auth, token managers, session handlers
  • Couche Infrastructure : Doctrine repositories, Symfony Security integration, HTTP controllers

Cette séparation permet de tester unitairement la logique d’auth sans base de données. Les tests E2E avec Playwright complètent en validant les parcours complets (inscription → vérification → login → 2FA).

Ce que j’ai appris

L’installation automatisée est critique

Un bundle qui nécessite 15 étapes manuelles ne sera pas adopté. Le wizard better-auth:install a été la feature la plus importante — bien plus que n’importe quelle fonctionnalité d’auth.

La sécurité ne se délègue pas à l’IA

J’ai utilisé Claude Code pour accélérer le développement, mais chaque décision de sécurité a été validée manuellement. Hashing, token generation, session management — tout a été audité ligne par ligne. L’IA dans le workflow est un accélérateur, pas un auditeur de sécurité.

Le naming est un contrat d’API

better-auth:install, better-auth:setup-features, better-auth:add-controller — chaque commande suit une convention claire. Le naming des commandes Symfony est un contrat d’API avec le développeur. Il doit être intuitif, prévisible et cohérent.

En résumé

BetterAuth Symfony offre un système d’authentification moderne complet pour Symfony 6/7 :

  • Installation en 5 minutes via un wizard interactif
  • Tokens Paseto V4 pour le mode API (plus sûrs que JWT)
  • OAuth, 2FA, magic links prêts à l’emploi
  • Multi-tenant avec organisations et équipes
  • 30+ endpoints générés automatiquement

Le projet est open source : github.com/MakFly/betterauth-symfony.

KD

Kevin De Vaubree

Développeur Full-Stack Senior