nyan02 / kphp_oauth2_keycloak
KPHP OAuth2 客户端提供商
Requires
- php: >=7.4
- nyan02/kphp_jwt: ^1.0
- nyan02/kphp_oauth2_client: ^1.0
- vkcom/kphp-polyfills: ^1.0
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服务器管理员配置的自定义字段的值。