nyan02/kphp_oauth2_keycloak

KPHP OAuth2 客户端提供商

1.0.0 2023-04-12 09:31 UTC

This package is auto-updated.

Last update: 2024-09-14 14:40:03 UTC


README

此包为KPHP提供了Keycloak OAuth 2.0 支持

安装

要安装,请使用composer

composer require nyan02/kphp_oauth2_keycloak

用法

用法与KPHP OAuth客户端类似,使用 nyan02\kphp_oauth2_client\Provider\Keycloak 作为提供商。

您需要创建一个新的Provider对象,指定 keycloak-client-id、keycloak-client-secret 和 callback-url。

与通用提供程序类的主要区别在于,您必须设置Keycloak特定参数:AuthServerUrl 和 Realm。您还可以设置您的Keycloak版本(这将更改默认的作用域)。

如果您已配置您的Keycloak实例使用加密,您有一些高级选项可供选择。您可以将提供程序配置为使用相同的加密算法,并使用预期的解密公钥或证书。您可以通过指定路径或直接传递内容来设置密钥。

下面是一个示例。

授权代码示例

<?php

use nyan02\kphp_oauth2_client\Grant\AuthorizationCode;
use nyan02\kphp_oauth2_client\Provider\Keycloak;

require_once __DIR__ . '/vendor/autoload.php';

$provider = new Keycloak('{keycloak-client-id}',
    '{keycloak-client-secret}',
    'https://example.com/callback-url',
    );
    
$provider->setAuthServerUrl('https://example.com/auth');
$provider->setRealm('realm');
$provider->setVersion('20.0.1'); // optional
$provider->setEncryptionAlgorithm('RS256'); // optional
$provider->setEncryptionKeyPath('../key.pem'); // optional
$provider->setEncryptionKey('contents_of_key_or_certificate'); // optional

if (!isset($_GET['code'])) {

    $params = $provider->getAuthorizationParameters();
    $authUrl = $provider->getAuthorizationUrl($params);
    $_SESSION['oauth2state'] = $provider->getState();
    header('Location: '.$authUrl);
    exit;

} else {
    $grant = new AuthorizationCode($provider->getClientId(), $provider->getClientSecret(), $provider->getRedirectUri());
    $token = $provider->getAccessToken($grant, ['code' => $_GET['code']]);

    // Optional: Now you have a token you can look up a users profile data
    try {

        // We got an access token, let's now get the user's details
        $user = $provider->getResourceOwner($token);

        // Use these details to create a new profile
        printf('Hello %s!', $user->getName());

    } catch (Exception $e) {
        exit('Failed to get resource owner: '.$e->getMessage());
    }

    // Use this to interact with an API on the users behalf
    echo $token->getToken();
}

授权代码流

在配置提供程序后,我们想要获取授权代码。我们使用 getAuthorizationParameters() 方法从提供程序获取参数,包括权限作用域和其他生成 AuthorizationUrl 所需的信息。

接下来,我们使用 getAuthorizationUrl($params) 方法生成 AuthorizationUrl,并传递我们之前获取的参数。现在我们有了Url,我们可以将用户重定向到提供程序的授权页面。

一旦我们得到了授权代码,我们就为它创建一个占位符类

new AuthorizationCode($provider->getClientId(), $provider->getClientSecret(), $provider->getRedirectUri())

并将它传递给 getAccessToken 方法,同时传递我们得到的代码。

$token = $provider->getAccessToken($grant, ['code' => $_GET['code']]);

现在我们有资源的访问令牌。

获取资源所有者信息

有了访问令牌,我们现在可以访问资源所有者的信息。

$user = $provider->getResourceOwner($token);

为 KeycloakResourceOwner 实现的方法有 getId()、getEmail()、getName() 和 toJSON()。toJSON() 允许获取由Keycloak服务器管理员配置的自定义字段的值。