danieleambrosino/firebase-authentication-bundle
Installation
composer require danieleambrosino/firebase-authentication-bundle
Ensure FIREBASE_PROJECT_ID is set in .env:
FIREBASE_PROJECT_ID=your-project-id
Enable in Security
Add to config/packages/security.yaml:
security:
firewalls:
api:
stateless: true
firebase: ~
First Use Case
Authorization: Bearer <token> header.Test with:
curl -H "Authorization: Bearer YOUR_FIREBASE_ID_TOKEN" http://your-app/api/protected-route
config/packages/firebase_authentication.yaml (default config)src/FirebaseAuthenticator.php (core logic)src/TokenResolver.php (token extraction)Bearer Token Authentication
Authorization header.// In a controller
public function protectedRoute(): JsonResponse
{
$user = $this->getUser(); // User entity from Firebase
return new JsonResponse(['user' => $user->getEmail()]);
}
Cookie-Based Authentication
firebaseauth).strategy: cookie in firewall and ensure same-site cookie policies are met.firewalls:
main:
firebase:
strategy: cookie
Custom User Provider
FirebaseUserProvider to map Firebase claims to your user model:
use DanieleAmbrosino\FirebaseAuthenticationBundle\Security\User\FirebaseUserProvider;
class CustomUserProvider extends FirebaseUserProvider
{
public function loadUserByUsername($username): UserInterface
{
$firebaseUser = parent::loadUserByUsername($username);
return new YourUserEntity($firebaseUser->getEmail());
}
}
security.yaml:
providers:
firebase:
id: App\Security\CustomUserProvider
Token Refresh Handling
exp claim (default TTL: 1 hour).@Security("is_granted('ROLE_USER')") for automatic auth.firebase/app and firebase/auth to handle token generation/refresh.$token = $this->createMock(FirebaseToken::class);
$token->method('getClaims')->willReturn(['uid' => 'test-user']);
$this->container->set('firebase_auth.token_resolver', $token);
Token Validation Failures
401 Unauthorized with no debug info.config/packages/firebase_authentication.yaml:
debug: true
FIREBASE_PROJECT_ID (verify in Firebase Console).Authorization header or incorrect format.Cookie Strategy Quirks
SameSite=Lax or None (with Secure flag).csrf_token to protected routes.Time Skew Issues
iat (issued at) and exp (expiry) timestamp.clock_skew in config:
clock_skew: 60 # Allow 60-second skew
Custom Claims Not Persisted
use Firebase\Admin\Auth;
$claims = Auth::getInstance()->getUser($uid)->getCustomClaims();
$event = new FirebaseAuthEvent($token);
$this->container->get('event_dispatcher')->dispatch($event, 'firebase_auth.token_validated');
use Firebase\Admin\Auth;
try {
$decoded = Auth::decodeIdToken($token);
} catch (\Exception $e) {
// Handle error
}
.env for:
FIREBASE_PROJECT_ID=your-project-id
FIREBASE_PRIVATE_KEY=... # Only needed if using Firebase Admin SDK
Custom Token Resolver
TokenResolverInterface to extract tokens from custom headers:
class CustomTokenResolver implements TokenResolverInterface
{
public function resolveToken(Request $request): ?string
{
return $request->headers->get('X-Custom-Token');
}
}
services:
App\Security\CustomTokenResolver:
tags: ['firebase_auth.token_resolver']
Event Listeners
firebase_auth.token_validated to modify user data:
use DanieleAmbrosino\FirebaseAuthenticationBundle\Event\FirebaseAuthEvent;
public function onTokenValidated(FirebaseAuthEvent $event)
{
$user = $event->getUser();
$user->addRole('CUSTOM_ROLE');
}
services.yaml:
tags: ['kernel.event_listener', 'firebase_auth.token_validated']
Dynamic Config
config/packages/firebase_authentication.yaml:
firebase_authentication:
strategies:
bearer:
clock_skew: 120
issuer: https://securetoken.google.com/your-project-id
providers:
firebase:
user_class: App\Entity\CustomUser
How can I help you explore Laravel packages today?