agrodata/keycloak-authz

🔑 Keycloak Guard 授权用于 Laravel/Lumen

此包的官方仓库似乎已消失,因此已冻结此包。

v1.2 2022-01-03 13:08 UTC

This package is auto-updated.

Last update: 2022-12-31 00:19:35 UTC


README

alt text

Laravel/Lumen Keycloak Authz

此包是为了实现 Keycloak 对 Laravel/Lumen API 的认证和授权。

基于 laravel-keycloak-guard 包创建,增加了以下功能

  • 在本地数据库中注册用户数据
  • 管理授权/权限

要求

✔️ API 在 Laravel/Lumen 上构建。

✔️ 您无法使用 Laravel Passport,因为 Keycloak 会完成所需的工作。

✔️ 前端项目应与后端分离。

✔️ 前端将直接在 Keycloak 服务器 上进行认证,并将令牌发送到后端。

✔️ 前端保持 Keycloak 服务器的 JWT 令牌。

✔️ 前端使用此令牌向 API 发送请求。

✔️ 要使用权限和 middleware can,Keycloak 客户端必须激活并配置 授权 功能。

(x) 如果您没有这些要求,可能需要使用 https://socialiteproviders.com/Keycloakhttps://github.com/Vizir/laravel-keycloak-web-guard

  1. 前端通过服务器 Keycloak 进行认证并获得 AccessToken。

  2. 前端通过发送 access token 到 api 发起请求。

  3. API 通过 Keycloak Guard 验证 accessToken。

    • 验证令牌签名。
    • 验证令牌结构。
    • 验证令牌过期时间。
    • 验证 API 是否允许令牌的 resource access
    • 检查令牌中是否包含权限/授权

    3.1 如果令牌有效,则更新数据库中的用户数据。

  4. 检查用户的权限(如果 search_permission 已激活)

  5. 通过 middleware :can 验证权限(如果 search_permission 已激活)

  6. 返回响应

安装

Laravel / Lumen

安装此包

composer require agrodata/keycloak-authz

用于 Lumen

在您的 bootstrap `app.php` 文件中注册 Provider

在文件末尾添加以下行。

$app->register(\KeycloakGuard\KeycloakGuardServiceProvider::class);

要使用 Facades,请取消注释您的 bootstrap/app.php 文件中的 $app->withFacades();

配置

Keycloak Guard

Keycloak Guard 的配置可以通过 .env 文件进行。⚠️ 确保所有字符串都带有双引号。

可选:您可以发布配置文件。

php artisan vendor:publish  --provider="Agrodata\KeycloakAuthz\KeycloakGuardServiceProvider"
<?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', 'username'),

  'token_principal_attribute' => env('KEYCLOAK_TOKEN_PRINCIPAL_ATTRIBUTE', 'preferred_username'),

  'append_decoded_token' => env('KEYCLOAK_APPEND_DECODED_TOKEN', false),

  'allowed_resources' => env('KEYCLOAK_ALLOWED_RESOURCES', null),
  
  /**
   * autorization attributes
   */
   'search_permissions' => env('KEYCLOAK_SEARCH_PERMISSIONS', true),

   'client_id' => env('KEYCLOAK_CLIENT_ID', null),

   'token_endpoint' => env('KEYCLOAK_TOKEN_ENDPOINT', null),
];

✔️ realm_public_key

必需。

Keycloak 服务器 realm 公钥(字符串)。

如何获取 realm 公钥?点击 "Realm 设置" > "密钥" > "算法 RS256" 行 > "公钥" 按钮

✔️ load_user_from_database

必需。默认值为 true

如果您没有 users 表,您应禁用此属性。 load_user_from_database 将检查您是否已在数据库中拥有此用户,执行数据更新并将它们返回到认证对象 (Auth::class)。如果启用,则必须与 user_provider_credentialtoken_principal_attribute 属性一起工作。

✔️ user_provider_credential

必需。默认值为 username

表格“users”的字段应包含一个唯一标识符(例如,用户名、电子邮件、昵称)。在身份验证过程中,将与token_principal_attribute属性进行比较。

✔️ token_principal_attribute

必需。默认值为preferred_username

JWT令牌的属性,将用作唯一标识符。在身份验证过程中,将与user_provider_credential属性进行比较。

✔️ append_decoded_token

默认值false

将解码的令牌(包含用户信息)附加到$user->token。用于获取诸如配置文件、组和其他附加到JWT的信息。如果为false,您也可以通过Auth::token()获取它。

✔️ allowed_resources

必需。

通常,您的API应处理一个resource_access。但如果您处理多个,请仅使用逗号分隔的资源列表,这些资源是API接受的。此属性将在身份验证过程中与JWT的resource_access属性进行比较。

✔️ search_permission

必需。

默认值false

检查JWT令牌是否包含授权/授权信息。如果没有,它将在Keycloak服务器上查找授权数据,以记录权限并使用中间件“:can”保护路由。这取决于token_endpointclient_id属性是否正确提供。

✔️ client_id

可选。

默认值null

在Keycloak服务器上标识具有激活的授权/权限模块的客户端。

✔️ token_endpoint

默认值null

可选。

用于在Keycloak服务器上查找令牌授权信息的URL。

Laravel Auth

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

将通过令牌验证来保护路由,请在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

将通过令牌验证来保护路由,请在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

Keycloak Guard Illuminate\Contracts\Auth\Guard的简单实现。因此,所有Laravel标准方法都将可用。例如:Auth::user()将返回已验证的用户。

标准方法

  • check()
  • guest()
  • user()
  • id()
  • validate()
  • setUser()

Keycloak Guard方法

  • token()

例如:Auth::token()返回完整的解码令牌。

  • 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