juliuspc/openid-connect-php

OpenID Connect 客户端

v1.2.0 2024-02-14 22:33 UTC

README

这是一个简单的库,允许应用程序通过基本的 OpenID Connect 流来验证用户。这个库希望通过简化设置过程,鼓励开发者使用 OpenID Connect 进行身份验证,即使他们对 OpenID Connect 协议了解不多。

该库是 jumbojett/OpenID-Connect-PHP 的分支,该分支似乎已被废弃。关于修复原始库的bug的进展,请参阅这个维基页面

支持的规范

要求

  1. PHP 7.3 或更高版本
  2. JSON 扩展

安装

  1. 使用 composer 安装库
composer require juliuspc/openid-connect-php
  1. 包含 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。此示例展示了两个特殊之处

  1. 如果您的 OpenID 提供商允许您这样做,并且如果您的实际场景确实需要,您可以选择省略客户端密钥。这是一个罕见的情况,因为 PHP 应用程序通常是机密的 OAuth 客户端,因此不会泄露客户端密钥。
  2. 通过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文件中。