b2pweb/parroauth2-client

B2P OAuth 2 客户端实现

v1.5.0 2024-06-19 09:08 UTC

This package is auto-updated.

Last update: 2024-09-19 10:31:04 UTC


README

build Scrutinizer Code Quality Code Coverage Packagist Version Total Downloads Type Coverage

PHP 的 OAuth 2.0 和 OpenID Connect 客户端库。

安装

使用 composer 安装

composer require b2pweb/parroauth2-client

简单用法

对于简单用法,使用 授权服务器元数据 RFC 8414OpenID 连接发现,您可以在 示例 目录中查看。

密码认证

使用 密码 授权类型(参照:RFC 6749#4.3)对提供者进行认证。

此示例仅配置 OAuth 2.0 客户端,并使用所有者的凭据(即用户名和密码)调用提供者的令牌端点。

标准认证流程

使用 授权码 授权类型(参照:RFC 6749#4.1)实现客户端端认证,这是推荐的授权流程。

  • 首先配置会话存储
  • 然后加载提供者和客户端
  • 注册扩展
    • JwtAccessToken 启用对访问令牌的本地 introspection
    • Pkce 启用 PKCE RFC 7636 以减轻授权码截获攻击
    • IdTokenValidator(仅适用于 OpenID)以启用 ID Token 的验证
    • TokenStorage 将访问令牌存储到会话中,并将其提供给 OAuth 端点
    • RequiredScopeValidator 断言访问令牌中提供了给定的作用域。
  • 如果令牌不存在或已过期,则通过使用 AuthorizationCodeFlow 执行认证过程
  • 一旦认证成功,执行用户信息和 introspection
  • 还实现了 注销 动作,使用撤销端点并将用户重定向到 OP 以停止会话

服务器端访问令牌检查

使用本地 introspection 检查作为 Authorization: Bearer 标头的传递的访问令牌。

高级用法

手动配置提供者

如果认证提供者未实现自动发现,或者您想手动配置,则可以使用 ProviderBuilder

$loader = new \Parroauth2\Client\Provider\ProviderLoader();

// Configure and create the provider
$provider = $loader->builder('http://my-op.example.com')
    ->openid() // Enable openid connection on the endpoint

    // Configure endpoints
    ->tokenEndPoint('/token')
    ->authorizationEndPoint('/auth')
    ->introspectionEndPoint('/introspect')
    
    // Configure public key for local introspection
    ->addKeyFile('./keys/provider.pub')
    
    ->create()
;

// Create the client
$client = $provider->client((new \Parroauth2\Client\ClientConfig('client_id'))->setSecret('secret'));

延迟提供者

在某些情况下,您应该延迟加载提供者,并且仅在需要时才加载它。这在使用将客户端或提供者注入到服务中的依赖注入容器时是必要的。

在这种情况下,您可以使用 ProviderLoader::lazy(),它允许仅在调用 OP 端点时加载提供者。

设计考虑

端点

端点是不可变的,对设置器的任何调用都将返回端点的新实例。

因此以下代码是无效的

/** @var $client \Parroauth2\Client\ClientInterface */
$token = $client->endPoints()->token();
$token->refresh('MyRefreshToken'); // This instruction has no effect : the return value is ignored

$token->call(); // This call will fail : no token has been provided

要保存状态,如提供令牌,您应使用具有 EndPointTransformerInterface 的扩展,或在每个端点调用时手动注入参数。

扩展

扩展由一个具有单个方法 configure() 的类组成,该方法接受客户端作为参数。它们允许修改或配置客户端的任何可变元素,例如

  • 更改客户端配置
  • 注册或替换端点
  • 注册 EndPointTransformerInterface

要简单地应用端点转换器,可以继承 AbstractEndPointTransformerExtension,实现所需的端点转换方法,并使用 CallableEndPointInterface::onResponse() 来拦截响应。

注意:因为端点是不可变的,端点转换器必须返回配置的端点实例