juliuspc / openid-connect-php
OpenID Connect 客户端
Requires
- php: >=7.3
- ext-json: *
- guzzlehttp/guzzle: ^7
- guzzlehttp/psr7: ^1.8
- phpseclib/phpseclib: ~2.0
Requires (Dev)
- phpunit/phpunit: ^9.5
- roave/security-advisories: dev-latest
This package is auto-updated.
Last update: 2024-09-15 00:11:33 UTC
README
这是一个简单的库,允许应用程序通过基本的 OpenID Connect 流来验证用户。这个库希望通过简化设置过程,鼓励开发者使用 OpenID Connect 进行身份验证,即使他们对 OpenID Connect 协议了解不多。
该库是 jumbojett/OpenID-Connect-PHP 的分支,该分支似乎已被废弃。关于修复原始库的bug的进展,请参阅这个维基页面。
支持的规范
- OpenID Connect 核心规范 1.0
- OpenID Connect Discovery 1.0 (发现发行者缺失)
- OpenID Connect RP-Initiated Logout 1.0 - 草案 01
- OpenID Connect 动态客户端注册 1.0
- RFC 6749: OAuth 2.0 授权框架
- RFC 7009: OAuth 2.0 令牌撤销
- RFC 7636: OAuth 公共客户端通过代码交换的证明密钥
- RFC 7662: OAuth 2.0 令牌检查
- RFC 8693: OAuth 2.0 令牌交换
- 草案:授权响应中的 OAuth 2.0 授权服务器发行者标识符
要求
- PHP 7.3 或更高版本
- JSON 扩展
安装
- 使用 composer 安装库
composer require juliuspc/openid-connect-php
- 包含 composer 自动加载器
require __DIR__ . '/vendor/autoload.php';
示例 1:基本客户端
此示例使用授权码流,并将在 OpenID 提供者在 Discovery 文档中宣布时使用 PKCE。如果您不确定应该选择哪种流:这是最佳选择。这是最安全且最灵活的流。
use JuliusPC\OpenIDConnect\Client; $oidc = new Client('https://id.example.com', 'ClientIDHere', 'ClientSecretHere'); $oidc->authenticate(); $name = $oidc->requestUserInfo('given_name');
请参阅 OpenID Connect 规范以获取可用的用户属性
示例 2:动态注册
use JuliusPC\OpenIDConnect\Client; $oidc = new Client("https://id.example.com"); $oidc->register(); $client_id = $oidc->getClientID(); $client_secret = $oidc->getClientSecret(); // Be sure to add logic to store the client id and client secret
示例 3:网络和安全
// Configure a proxy $oidc->setHttpProxy("http://my.proxy.example.net:80/"); // Configure a cert // If we omit this, the OS’ default cert bundle will be used $oidc->setCertPath("/path/to/my.cert");
示例 4:请求客户端凭据令牌
use JuliusPC\OpenIDConnect\Client; $oidc = new Client('https://id.example.com', 'ClientIDHere', 'ClientSecretHere'); $oidc->providerConfigParam(array('token_endpoint'=>'https://id.example.com/connect/token')); $oidc->addScope('my_scope'); // this assumes success (to validate check if the access_token property is there and a valid JWT) : $clientCredentialsToken = $oidc->requestClientCredentialsToken()->access_token;
示例 5:隐式流的简单客户端
隐式流应被视为一个遗留流,如果可以使用授权码授予,则不应使用。由于其缺点和安全性较差,隐式流将随着即将到来的 OAuth 2.1 标准而被淘汰。请参阅示例 1 了解替代方案。
use JuliusPC\OpenIDConnect\Client; $oidc = new Client('https://id.example.com', 'ClientIDHere', 'ClientSecretHere'); $oidc->setResponseTypes(array('id_token')); $oidc->addScope(array('openid')); $oidc->setAllowImplicitFlow(true); $oidc->addAuthParam(array('response_mode' => 'form_post')); $oidc->authenticate(); $sub = $oidc->getVerifiedClaims('sub');
示例 6:访问令牌的检查
根据RFC 7662定义的检查,旨在获取有关令牌的信息,而无需解析它。特别是所谓的参考令牌,它们是随机字符串且不包含信息。
use JuliusPC\OpenIDConnect\Client; $oidc = new Client('https://id.example.com', 'ClientIDHere', 'ClientSecretHere'); $data = $oidc->introspectToken('an.access-token.as.given'); if (!$data->active) { // the token is no longer usable }
示例 7:PKCE 客户端
在示例 1 中的大多数场景中已经配置了 PKCE。此示例展示了两个特殊之处
- 如果您的 OpenID 提供商允许您这样做,并且如果您的实际场景确实需要,您可以选择省略客户端密钥。这是一个罕见的情况,因为 PHP 应用程序通常是机密的 OAuth 客户端,因此不会泄露客户端密钥。
- 通过
setCodeChallengeMethod()
显式设置代码挑战方法。如果您的OpenID提供者在发现文档中没有宣布支持它,但仍然支持PKCE,则此操作可以启用PKCE。
use JuliusPC\OpenIDConnect\Client; $oidc = new Client('https://id.example.com', 'ClientIDHere', 'ClientSecret'); // you may obmit the client secret // for some reason we want to set S256 explicitly as Code Challenge Method // maybe your OP doesn’t announce support for PKCE in its discovery document $oidc->setCodeChallengeMethod('S256'); $oidc->authenticate(); $name = $oidc->requestUserInfo('given_name');
开发环境
在某些情况下,您可能需要在开发系统上禁用TLS证书验证。注意:在生产系统上不建议这样做。
$oidc->setVerifyPeer(false);
单元测试
运行单元测试
./vendor/bin/phpunit tests
生成代码覆盖率报告(在浏览器中打开html/index.html查看结果)
XDEBUG_MODE=coverage ./vendor/bin/phpunit --coverage-html html tests/
注意:您可能需要安装Xdebug才能使此操作正常工作。
待办事项
- 动态注册不支持注册认证令牌和端点
- 改进此库的测试和测试覆盖率
贡献
- 所有合并的pull请求应添加到CHANGELOG.md文件中。