adrienbrault/oauth2-facebook-grant-bundle
Symfony bundle that adds a Facebook access-token grant to FOSOAuthServerBundle. Lets your API exchange a valid Facebook token for an OAuth2 access token, resolving the user via a custom Facebook user provider for mobile/SSO logins.
spatie/laravel-symfony-support).lcobucci/jwt, league/oauth2-server).UserProvider logic to link Facebook IDs to Laravel’s user model (e.g., App\Models\User).league/oauth2-server or typhon/oauth2-server.facebook/graph-sdk for token validation.UserProvider pattern can be replicated via Laravel’s UserRepository or Service Provider bindings.UserProviderInterface; Laravel’s User model requires manual mapping.Grant system may need Laravel’s Guard/Auth system adaptation.league/oauth2-client for Facebook token validation.Service Provider.PersonalAccessToken or a custom grant?firstLoginAt field)?FOSOAuthServerBundle with Laravel Passport (for OAuth2) or Typhon OAuth2 Server.facebook/graph-sdk for token validation (instead of Symfony’s OAuth2 client).| Symfony Bundle Feature | Laravel Equivalent |
|---|---|
FOSOAuthServerBundle |
laravel/passport or typhon/oauth2-server |
UserProviderInterface |
App\Services\FacebookUserMapper (custom) |
| Facebook Token Validation | facebook/graph-sdk + manual JWT checks |
Grant URI (/facebook_access_token) |
Laravel API route (POST /oauth/facebook/token) |
Phase 1: Token Validation
facebook/graph-sdk.use Facebook\Facebook;
use Facebook\Exceptions\FacebookSDKException;
class FacebookTokenValidator {
public function validate(string $facebookToken): ?string {
$fb = new Facebook(['app_id' => env('FB_APP_ID'), 'app_secret' => env('FB_APP_SECRET')]);
try {
$response = $fb->get('/me?fields=id,name,email', $facebookToken);
return $response->getGraphUser()['id'];
} catch (FacebookSDKException $e) {
return null; // Invalid token
}
}
}
Phase 2: User Mapping
class FacebookUserProvider {
public function getUserByFacebookId(string $facebookId): ?User {
return User::where('facebook_id', $facebookId)->first();
}
public function createUserFromFacebook(array $fbData): User {
return User::create([
'name' => $fbData['name'],
'email' => $fbData['email'] ?? null,
'facebook_id' => $fbData['id'],
]);
}
}
Phase 3: OAuth2 Grant Integration
// routes/api.php
Route::post('/oauth/facebook/token', function (Request $request) {
$validator = new FacebookTokenValidator();
$facebookId = $validator->validate($request->input('facebook_token'));
if (!$facebookId) return response()->json(['error' => 'invalid_token'], 401);
$userProvider = new FacebookUserProvider();
$user = $userProvider->getUserByFacebookId($facebookId) ?? $userProvider->createUserFromFacebook($fbData);
return response()->json([
'access_token' => $user->createToken('FacebookToken')->accessToken,
'token_type' => 'Bearer',
]);
});
facebook/graph-sdk is actively maintained.Grant system is replaced by Laravel’s Auth/Passport logic.app_id/app_secret./oauth/facebook/token).FacebookTokenValidator) are reusable across projects.facebook/graph-sdk logs for token validation failures.Auth events (retrieving-user, authenticated) for user mapping issues.Redis) to avoid repeated API calls./oauth/facebook/token endpoint to prevent abuse.| Scenario | Impact | Mitigation |
|---|---|---|
| Invalid Facebook token | API rejects user | Fallback to email/password auth |
| Facebook API downtime | Token validation fails | Cache valid tokens; retry logic |
| User mapping errors | Duplicate users or missing data | Idempotent user creation |
| Laravel Passport misconfig | OAuth2 flow breaks | Test with Postman/Insomnia |
UserProvider) must be translated to Laravel.FacebookSDKException).FacebookTokenValidator and FacebookUserProvider./oauth/facebook/token endpoint with mocked Facebook responses.How can I help you explore Laravel packages today?