Complete guide to install and configure BetterAuth Symfony bundle.
# 1. Install the bundle
composer require betterauth/symfony-bundle
# 2. Run the installation wizard
php bin/console better-auth:install
The wizard will guide you through:
php bin/console better-auth:install
The wizard asks:
[STABLE], GitHub, Facebook, Microsoft, Discord [DRAFT]For CI/CD or automation:
php bin/console better-auth:install \
--id-strategy=uuid \
--mode=api \
--no-interaction
| Option | Values | Description |
|---|---|---|
--id-strategy |
uuid, int |
ID generation strategy |
--mode |
api, session, hybrid |
Authentication mode |
--exclude-fields |
name, avatar |
Comma-separated list of optional User fields to exclude |
--minimal |
- | Exclude all optional fields (name, avatar) |
--skip-migrations |
- | Don't generate/run migrations |
--skip-controller |
- | Don't generate AuthController |
--skip-config |
- | Don't generate config files |
--no-interaction |
- | Run without prompts |
If you only need email/password authentication without profile fields:
php bin/console better-auth:install \
--id-strategy=uuid \
--mode=api \
--minimal \
--no-interaction
Or exclude only specific fields:
# Keep name, exclude avatar
php bin/console better-auth:install \
--id-strategy=uuid \
--mode=api \
--exclude-fields=avatar
# Exclude both name and avatar (same as --minimal)
php bin/console better-auth:install \
--id-strategy=uuid \
--mode=api \
--exclude-fields=username,avatar
src/Entity/
├── User.php # User entity (UUID v7 or INT)
├── Session.php # Session tracking
├── RefreshToken.php # Refresh token storage
├── MagicLinkToken.php # Passwordless magic links
├── EmailVerificationToken.php # Email verification tokens
├── PasswordResetToken.php # Password reset tokens
├── TotpData.php # 2FA/TOTP data
└── GuestSession.php # Guest sessions (optional)
Contrôleurs fournis :
src/Controller/
├── Trait/
│ └── AuthResponseTrait.php # Réponses API cohérentes
├── CredentialsController.php # register / login / login 2FA
├── TokenController.php # me / refresh / logout / revoke-all
├── TwoFactorController.php # setup / validate / verify / disable / backup codes
├── PasswordResetController.php # reset mot de passe
├── EmailVerificationController.php # envoi + vérification email
├── MagicLinkController.php # login sans mot de passe
├── SessionController.php # liste/révocation des sessions
├── GuestSessionController.php # sessions invitées
└── OAuthController.php # OAuth (Google, GitHub, Facebook, Microsoft, Discord)
| Controller | Route | Description |
|---|---|---|
| CredentialsController | POST /auth/register, POST /auth/login, POST /auth/login/2fa |
|
| TokenController | GET /auth/me, POST /auth/refresh, POST /auth/logout, POST /auth/revoke-all |
|
| TwoFactorController | POST /auth/2fa/setup, POST /auth/2fa/validate, POST /auth/2fa/verify, POST /auth/2fa/disable, GET /auth/2fa/status, POST /auth/2fa/reset, POST /auth/2fa/backup-codes/regenerate |
|
| PasswordResetController | POST /auth/password/forgot, POST /auth/password/reset, POST /auth/password/verify-token |
|
| EmailVerificationController | POST /auth/email/send-verification, POST /auth/email/verify, GET /auth/email/verification-status |
|
| MagicLinkController | POST /auth/magic-link/send, POST /auth/magic-link/verify, GET /auth/magic-link/verify/{token} |
|
| SessionController | GET /auth/sessions, DELETE /auth/sessions/{sessionId} |
|
| GuestSessionController | POST /auth/guest/create, GET /auth/guest/{token}, POST /auth/guest/convert, DELETE /auth/guest/{token} |
|
| OAuthController | GET /auth/oauth/providers, GET /auth/oauth/{provider}, GET /auth/oauth/{provider}/url, GET /auth/oauth/{provider}/callback |
config/packages/
└── better_auth.yaml # BetterAuth configuration
# .env
BETTER_AUTH_SECRET=auto_generated_64_char_secret
APP_URL=http://localhost:8000
Le bundle détecte automatiquement les entités App\Entity\* et configure les repositories Doctrine via EntityAutoConfigurationPass. Aucune configuration manuelle dans services.yaml n'est nécessaire.
Set DATABASE_URL according to your database engine:
# PostgreSQL
DATABASE_URL=postgresql://app:secret@127.0.0.1:5432/app?serverVersion=16&charset=utf8
# SQLite
DATABASE_URL=sqlite:///%kernel.project_dir%/var/data.db
# MySQL 8.4
DATABASE_URL=mysql://app:secret@127.0.0.1:3306/app?serverVersion=8.4&charset=utf8mb4
# MariaDB 11
DATABASE_URL=mysql://app:secret@127.0.0.1:3306/app?serverVersion=mariadb-11.0.2&charset=utf8mb4
# Create/update database schema
php bin/console doctrine:migrations:migrate
The bundle auto-configures security.yaml, but verify:
# config/packages/security.yaml
security:
providers:
better_auth:
id: BetterAuth\Symfony\Security\BetterAuthUserProvider
firewalls:
auth:
pattern: ^/auth
stateless: true
security: false
api:
pattern: ^/
stateless: true
provider: better_auth
custom_authenticators:
- BetterAuth\Symfony\Security\BetterAuthAuthenticator
access_control:
- { path: ^/auth, roles: PUBLIC_ACCESS }
- { path: ^/, roles: ROLE_USER }
php bin/console cache:clear
# Start server
symfony server:start
# Test registration
curl -X POST http://localhost:8000/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","password":"Password123","username":"Test User"}'
Add or remove optional fields (username, avatar) after installation:
# Add the name field
php bin/console better-auth:user-fields add name
# Add multiple fields
php bin/console better-auth:user-fields add name,avatar
# Remove a field (WARNING: data loss after migration!)
php bin/console better-auth:user-fields remove avatar
# Remove all optional fields
php bin/console better-auth:user-fields remove name,avatar
# Force without confirmation
php bin/console better-auth:user-fields remove name --force
After modifying fields:
# Generate migration for the changes
php bin/console doctrine:migrations:diff
# Apply migration
php bin/console doctrine:migrations:migrate
Available optional fields:
| Field | Type | Description |
|---|---|---|
name |
VARCHAR(255) | User display name |
avatar |
VARCHAR(500) | User avatar URL |
After initial installation, use better-auth:setup-features to add new features with automatic entity generation, controller scaffolding, and database migrations:
# 🚀 Enable Magic Link with everything auto-generated (recommended)
php bin/console better-auth:setup-features --enable=magic_link --with-controllers --migrate
# Enable multiple features at once
php bin/console better-auth:setup-features --enable=magic_link --enable=two_factor --migrate
# Enable OAuth with 2FA
php bin/console better-auth:setup-features --enable=oauth --enable=two_factor --with-controllers --migrate
# Use a preset (minimal, standard, full)
php bin/console better-auth:setup-features --preset=full --with-controllers --migrate
# Interactive mode (guided wizard)
php bin/console better-auth:setup-features
# List all features and their status
php bin/console better-auth:setup-features --list
# Preview changes without applying (dry-run)
php bin/console better-auth:setup-features --enable=magic_link --dry-run
What it does automatically:
config/packages/better_auth.yaml--with-controllers)doctrine:migrations:diff (with --with-migrations)--migrate)Available Features:
| Feature | Description | Entities Generated | Controllers |
|---|---|---|---|
magic_link |
Passwordless login via email | MagicLinkToken |
magic-link |
two_factor |
TOTP 2FA (Google Authenticator) | TotpData |
auth (2FA endpoints) |
oauth |
Google, GitHub, Facebook, etc. | - | oauth, account-link |
email_verification |
Verify user emails | EmailVerificationToken |
email-verification |
password_reset |
Forgot password flow | PasswordResetToken |
password |
session_management |
View/revoke sessions | - | sessions |
device_tracking |
Track user devices | Device |
devices |
security_monitoring |
Threat detection | SecurityEvent |
- |
guest_sessions |
Anonymous sessions | GuestSession |
guest |
multi_tenant |
Organizations & teams | Organization, OrganizationMember |
organizations |
Options:
| Option | Description |
|---|---|
--enable=FEATURE |
Enable a feature (can repeat) |
--disable=FEATURE |
Disable a feature |
--preset=PRESET |
Use preset: minimal, standard, full |
--with-controllers |
Generate required controllers |
--with-migrations |
Run doctrine:migrations:diff |
--migrate |
Run diff AND migrate |
--force |
Overwrite existing files |
--dry-run |
Preview changes without applying |
Example Workflow:
# 1. Initial installation (basic auth only)
php bin/console better-auth:install --id-strategy=uuid --mode=api
# 2. Later, add Magic Link feature
php bin/console better-auth:setup-features --enable=magic_link --with-controllers --migrate
# 3. Add 2FA
php bin/console better-auth:setup-features --enable=two_factor --migrate
# 4. Add OAuth
php bin/console better-auth:setup-features --enable=oauth --with-controllers --migrate
Add individual controllers after installation:
# List all available controllers
php bin/console better-auth:add-controller --list
# Add a specific controller interactively
php bin/console better-auth:add-controller
# Add OAuth controller
php bin/console better-auth:add-controller oauth
# Add all optional controllers at once
php bin/console better-auth:add-controller --all
# Force overwrite existing
php bin/console better-auth:add-controller oauth --force
Available Controllers:
| Controller | Description | Endpoints |
|---|---|---|
auth |
Core authentication (register, login, 2FA) | 11 |
password |
Password reset flow | 3 |
sessions |
Session management | 2 |
oauth |
OAuth providers (Google, GitHub, etc.) | 3 |
email-verification |
Email verification flow | 4 |
magic-link |
Passwordless authentication | 3 |
guest |
Guest/anonymous sessions | 4 |
account-link |
Link third-party accounts | 4 |
devices |
Device management & tracking | 6 |
Install required Composer packages:
php bin/console better-auth:setup:dependencies
Options:
--skip-install: Preview without installing--with-dev: Include dev dependenciesConfigure Monolog for BetterAuth:
php bin/console better-auth:setup:logging
Options:
--channel=NAME: Log channel (default: betterauth)--level=LEVEL: Log level (default: info)--path=PATH: Log file pathUpdate existing configuration files:
php bin/console better-auth:config:update
Config types:
all: Update all configs (default)security: Update security.yamlbetter_auth: Update better_auth.yamlmonolog: Update monolog.yamlOptions:
--dry-run: Preview changes--force: Overwrite existing# Show current mode
php bin/console better-auth:switch-mode
# Switch to API mode
php bin/console better-auth:switch-mode api
# Preview changes without applying
php bin/console better-auth:switch-mode session --dry-run
Generate complete configuration with presets:
# Interactive
php bin/console better-auth:generate-config
# With preset
php bin/console better-auth:generate-config --preset=standard
# With comments
php bin/console better-auth:generate-config --preset=enterprise --with-comments
Presets:
minimal: Basic API modestandard: API + OAuth (Google, GitHub) + 2FAenterprise: Hybrid mode + all featuresStep-by-step configuration:
# Full wizard
php bin/console better-auth:configure
# Configure specific section
php bin/console better-auth:configure --section=oauth
php bin/console better-auth:configure --section=2fa
# Clear cache
php bin/console cache:clear
# Check bundle is registered
php bin/console debug:container BetterAuth
chmod -R 755 var/log/
chmod -R 755 var/cache/
# Clear configuration cache
php bin/console cache:clear --env=prod
# Validate YAML syntax
php bin/console lint:yaml config/
# Check doctrine configuration
php bin/console doctrine:schema:validate
# Create migration manually
php bin/console doctrine:migrations:diff
How can I help you explore Laravel packages today?