saldanhaascs / laravel-keycloak-guard
🔑 Laravel >=8 简单 Keycloak 守卫
Requires
- firebase/php-jwt: ^5.0
Requires (Dev)
- orchestra/testbench: ^3.7@dev
- phpunit/phpunit: ^7.3@dev
README
Laravel 8 / Lumen 简单 Keycloak 守卫
此包可以帮助您根据从 Keycloak 服务器 生成的 JWT 令牌在 Laravel API 上对用户进行身份验证。
要求
✔️ 我正在使用 Laravel >=8 开发 API。
✔️ 我将不会使用 Laravel Passport 进行身份验证,因为 Keycloak 服务器将完成这项工作。
✔️ 前端是一个独立的项目。
✔️ 前端用户将直接在 Keycloak 服务器 上进行身份验证以获取 JWT 令牌。这个过程与 Laravel API 没有关系。
✔️ 前端将保留从 Keycloak 服务器获取的 JWT 令牌。
✔️ 前端使用该令牌向 Laravel API 发送请求。
💔 如果您的应用程序不满足这些要求,您可能需要查找 https://github.com/SocialiteProviders
流程
-
前端用户在 Keycloak 服务器上进行身份验证
-
前端用户获取 JWT 令牌。
-
在另一个时刻,前端用户使用该令牌向 Laravel API 上的受保护端点发送请求。
-
Laravel API(通过
Keycloak Guard)处理它。- 验证令牌签名。
- 验证令牌结构。
- 验证令牌过期时间。
- 验证我的 API 是否允许令牌进行
资源访问。
-
如果一切正常,找到数据库中的用户并在我的 API 上进行身份验证。
-
返回响应
安装
需要此包
composer require saldanhaascs/laravel-keycloak-guard
发布配置文件
php artisan vendor:publish --provider="KeycloakGuard\KeycloakGuardServiceProvider"
Lumen
在您的 bootstrap app 文件 boostrap/app.php 中注册提供者
在文件的 "注册服务提供者" 部分的底部添加以下行。
$app->register(\KeycloakGuard\KeycloakGuardServiceProvider::class);
对于外观,在您的 bootstrap app 文件 boostrap/app.php 中取消注释 $app->withFacades();
配置
Keycloak Guard
Keycloak Guard 的配置可以通过 Laravel .env 文件进行处理。⚠️ 确保所有字符串都进行了 裁剪。
<?php return [ 'realm_public_key' => env('KEYCLOAK_REALM_PUBLIC_KEY', null), 'load_user_from_database' => env('KEYCLOAK_LOAD_USER_FROM_DATABASE', true), 'user_provider_credential' => env('KEYCLOAK_USER_PROVIDER_CREDENTIAL', 'email'), 'token_principal_attribute' => env('KEYCLOAK_TOKEN_PRINCIPAL_ATTRIBUTE', 'email'), 'append_decoded_token' => env('KEYCLOAK_APPEND_DECODED_TOKEN', true), 'allowed_resources' => env('KEYCLOAK_ALLOWED_RESOURCES', 'account') ];
✔️ realm_public_key
必需。
Keycloak 服务器域的公钥(字符串)。点击 REALM-> 标签 KEYS-> 公钥。
✔️ load_user_from_database
必需。默认值为 true。
如果您没有 users 表,则必须禁用此功能。
它从数据库中获取用户并将值填充到已认证用户对象中。如果启用,它将与 user_provider_credential 和 token_principal_attribute 一起工作。
✔️ user_provider_credential
必需。默认值为 email。
"users" 表中包含用户唯一标识符的字段(例如,用户名、电子邮件、昵称)。在身份验证过程中,这将与 token_principal_attribute 属性进行对比。
✔️ token_principal_attribute
必需。默认值为 email。
JWT 令牌中包含用户标识符的属性。在身份验证过程中,这将与 user_provider_credential 属性进行对比。
✔️ append_decoded_token
默认值为 false。
将完整的解码 JWT 令牌附加到已认证的用户。如果您需要知道 JWT 令牌中持有的角色、组和其他用户信息,这很有用。即使选择 false,您也可以使用 Auth::token() 获取它,请参阅 API 部分。
✔️ allowed_resources
必需
通常,您的API应处理一个resource_access资源。但如果处理多个,请使用API接受的允许资源的逗号分隔列表。在认证过程中,此属性将与JWT令牌的resource_access属性进行对比。例如:account,client_id_keycloak_server。要了解令牌中的resource_access,请使用https://jwt.net.cn/#debugger-io。
默认为account。
默认设置为account,这样没有与客户端ID关联角色的用户也可以注册到Laravel数据库中。
Laravel认证
修改config/auth.php
'defaults' => [ 'guard' => 'api', # <-- For sure, i`m building an API 'passwords' => 'users', ], 'guards' => [ 'api' => [ 'driver' => 'keycloak', # <-- Set the API guard driver to "keycloak" 'provider' => 'users', ], ],
Laravel路由
只需在routes/api.php上保护一些端点即可完成!
// public endpoints Route::get('/hello', function () { return ':)'; }); // protected endpoints Route::group(['middleware' => 'auth:api'], function () { Route::get('/protected-endpoint', 'SecretController@index'); // more endpoints ... });
Lumen路由
只需在routes/web.php上保护一些端点即可完成!
// public endpoints $router->get('/hello', function () { return ':)'; }); // protected endpoints $router->group(['middleware' => 'auth'], function () { $router->get('/protected-endpoint', 'SecretController@index'); // more endpoints ... });
API
Simple Keycloak Guard实现了Illuminate\Contracts\Auth\Guard。因此,所有Laravel默认方法都将可用。例如:Auth::user()返回已认证的用户。
默认方法
- check()
- guest()
- user()
- id()
- validate()
- setUser()
Keycloak Guard方法
- token()
例如:Auth::token()返回已认证用户的完整解码JWT令牌
- hasRole('some-resource', 'some-role'):检查已认证的用户是否在资源中具有特定角色。
例如:使用此有效负载
'resource_access' => [
'myapp-backend' => [
'roles' => [
'myapp-backend-role1',
'myapp-backend-role2'
]
],
'myapp-frontend' => [
'roles' => [
'myapp-frontend-role1',
'myapp-frontend-role2'
]
]
]
Auth::hasRole('myapp-backend', 'myapp-backend-role1') => true
Auth::hasRole('myapp-frontend', 'myapp-frontend-role1') => true
Auth::hasRole('myapp-backend', 'myapp-frontend-role1') => false
联系方式
Twitter @SaBaLAkU

