stevenmaguire/oauth2-keycloak
Laravel-friendly OAuth2 client provider for Keycloak using theleague/oauth2-client. Handles Keycloak authorization, token retrieval/refresh, and user profile fetching so your app can authenticate via Keycloak with minimal setup.
stevenmaguire/oauth2-keycloak) extends the league/oauth2-client library, making it a natural fit for Laravel applications requiring Keycloak-based authentication (e.g., SSO, role-based access, or federated identity).socialiteproviders/keycloak), but offers direct Keycloak-specific optimizations (e.g., token handling, realm-specific configurations).keycloak guard in config/auth.php).groups, roles).league/oauth2-client (check Laravel’s PHP version support).laravel/socialite).groups or resource_access claims may require manual mapping to Laravel’s user model.league/oauth2-client directly if PKCE is critical.firebase/php-jwt)?email, groups) map to Laravel’s users table?Illuminate\Auth\GuardHelpers for Keycloak-specific logic.$this->app->bind(\Stevenmaguire\OAuth2\ClientProvider::class, function ($app) {
return new \Stevenmaguire\OAuth2\ClientProvider(
config('services.keycloak.client_id'),
config('services.keycloak.client_secret'),
config('services.keycloak.realm'),
config('services.keycloak.endpoint')
);
});
public function handle($request, Closure $next) {
$token = $request->bearerToken();
if (!$token || !auth()->guard('keycloak')->validateToken($token)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $next($request);
}
KeycloakGuard:
class KeycloakGuard extends Guard {
public function validateToken($token) {
return $this->provider->validateToken($token);
}
}
groups or roles to Laravel’s policies or gates.spatie/fractal) for Keycloak downtime./protocol/openid-connect).users table has fields for Keycloak-specific attributes (e.g., keycloak_sub, keycloak_groups).Access Type, Valid Redirect URIs, etc.).composer require stevenmaguire/oauth2-keycloak league/oauth2-client
config/services.php:
'keycloak' => [
'client_id' => env('KEYCLOAK_CLIENT_ID'),
'client_secret' => env('KEYCLOAK_CLIENT_SECRET'),
'realm' => env('KEYCLOAK_REALM'),
'endpoint' => env('KEYCLOAK_ENDPOINT', 'https://keycloak.example.com/auth/realms/{realm}'),
],
use Stevenmaguire\OAuth2\ClientProvider;
$provider = new ClientProvider($clientId, $clientSecret, $realm, $endpoint);
$authUrl = $provider->getAuthorizationUrl(['scope' => 'openid profile email']);
/logout endpoint).stevenmaguire/oauth2-keycloak and league/oauth2-client for breaking changes.composer.json until stability is confirmed.invalid_grant, server_error) for debugging.try {
$token = $provider->getAccessToken('authorization_code', ['code' => $code]);
} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
Log::error('Keycloak OAuth2 error: ' . $e->getMessage());
}
web_origins include your Laravel app’s domain.access_token refresh proactively.userinfo endpoint response structure.How can I help you explore Laravel packages today?