glance-project / cern-authentication
这是一个库,用于抽象使用CERN认证API的过程。
Requires
- php: ^8.2
- guzzlehttp/guzzle: ^6.0 || ^7.0
- nyholm/psr7: ^1.3
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.0
Requires (Dev)
- dq5studios/psalm-junit: ^2.0
- phpunit/phpunit: ^8.5
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.1
This package is auto-updated.
Last update: 2024-09-01 07:33:32 UTC
README
这是一个库,用于抽象使用CERN认证(一个使用Keycloak实现的OpenID服务器)的过程。
本文档**不**旨在教授OpenID、OAuth和Keycloak的基础知识。
安装
使用Composer安装。
composer require glance-project/cern-authentication
入门
要使用此库,您需要在应用门户上注册应用程序。如果您不知道这是什么意思,请参阅CERN授权服务文档
您的应用程序注册后,您将需要客户端ID。根据身份验证流程,您还需要客户端密钥和有效的重定向URL。
KeycloakProvider
KeycloakProvider
是库中的主要类。您需要它来执行任何类型的身份验证。
KeycloakProvider::create()
创建一个KeycloakProvider
对象。
<?php
use Glance\CernAuthentication\KeycloakProvider;
$keycloakProvider = KeycloakProvider::create();
KeycloakProvider::create()
可以可选地接受一个$options
数组,该数组将覆盖默认配置
$defaultOptions = [
"authenticationUri" => "https://auth.cern.ch/auth/realms/cern/protocol/openid-connect",
"apiAccessUri" => "https://auth.cern.ch/auth/realms/cern/api-access/token",
"client" => new \GuzzleHttp\Client(),
"serverRequestFactory" => new Nyholm\Psr7\Factory\Psr17Factory(),
"uriFactory" => new Nyholm\Psr7\Factory\Psr17Factory(),
"streamFactory" => new Nyholm\Psr7\Factory\Psr17Factory(),
];
只传递要更改的值。例如,如果您想使用CERN认证的QA环境
<?php
use Glance\CernAuthentication\KeycloakProvider;
$keycloakProvider = KeycloakProvider::create([
"authenticationUri" => "https://keycloak-qa.cern.ch/auth/realms/cern/protocol/openid-connect",
"apiAccessUri" => "https://keycloak-qa.cern.ch/auth/realms/cern/api-access/token",
]);
**注意** {: .panel-heading} 建议使用`createForProduction()`和`createForDevelopment()`。KeycloakProvider::createForProduction()
类似于KeycloakProvider::create()
,但默认情况下设置为生产URI。
示例
<?php
use Glance\CernAuthentication\KeycloakProvider;
$inProduction = getenv("ENVIRONMENT") === "PRODUCTION"; // true or false
$keycloakProvider = $inProduction ?
KeycloakProvider::createForProduction() :
KeycloakProvider::createForDevelopment();
KeycloakProvider::createForDevelopment()
类似于KeycloakProvider::create()
,但默认情况下设置为QA URI。
KeycloakProvider::apiAccess()
您可以使用API访问来获取访问令牌,这些API也使用CERN认证。
API访问是CERN认证服务器的一个非标准令牌端点。具有客户端凭据授权(即Keycloak服务帐户)的OpenID连接应用程序可以使用此端点通过提供有效的受众来为任何其他应用程序获取有效的API令牌。令牌中的角色是在目标应用程序中为获取令牌的应用程序身份分配的。
要使用此类型的身份验证,您需要一个具有客户端ID、客户端密钥并且能够执行客户端凭据流(在应用门户 > SSO注册中标记选项“我的应用程序将需要使用其自己的客户端ID和密钥获取令牌”)的应用程序。
此方法最常见的使用是获取用于其他CERN API的令牌,例如包括处理组端点的授权服务API。在下一个示例中,我们可以获取一个用于调用授权服务API(受众客户端ID:authorization-service-api
)的访问令牌。
<?php
$clientId = getenv("MY_APP_CLIENT_ID");
$clientSecret = getenv("MY_APP_CLIENT_SECRET");
$audienceClientId = "authorization-service-api";
$provider = KeycloakProvider::create();
$result = $provider->apiAccess($clientId, $clientSecret, $audienceClientId);
echo $result->accessToken(); // eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwi...
KeycloakProvider::introspectToken()
CERN授权服务提供了检查访问令牌有效性的可能性。这将检查令牌是否未被欺诈以及是否未过期。
对于令牌检查,您需要要检查的访问令牌,以及应用程序的客户端ID和客户端密钥。
<?php
$clientId = getenv("MY_APP_CLIENT_ID");
$clientSecret = getenv("MY_APP_CLIENT_SECRET");
$token = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwi...";
$provider = KeycloakProvider::create();
$user = $provider->introspectToken($token, $clientId, $clientSecret);
$user->personId(); // 837034
$user->username(); // mgunters
$user->email(); // mario.simao@cern.ch
$user->fullName(); // Mario Gunter Simao
$user->firstName(); // Mario
$user->lastName(); // Gunter Simao
$user->roles(); // ["admin", "test_role"]