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 :
- Configurer le firewall dans
security.yaml(40+ lignes) - Créer les entités User, Session, RefreshToken
- Écrire les contrôleurs login, register, logout, forgot-password
- Intégrer un provider OAuth (Google, GitHub, etc.)
- Ajouter la 2FA avec un bundle tiers
- Gérer les tokens de vérification email
- 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 :
- Stratégie d’ID : UUID v7 (recommandé) ou INT auto-increment
- Mode d’auth : API (tokens Paseto V4), Session (stateful), ou Hybride
- 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: nonepossible) - 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 :
| Domaine | Endpoints | Exemples |
|---|---|---|
| Auth basique | 4 | register, login, logout, refresh |
| Sessions | 3 | list, revoke, revoke-all |
| 2FA/TOTP | 3 | enable, verify, disable |
| Magic Links | 2 | request, verify |
| 2 | send-verification, verify | |
| OAuth | 2 | authorize, 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.
Kevin De Vaubree
Développeur Full-Stack Senior