flownative/oauth2-client

Flow 框架应用程序的通用 OAuth2 客户端基本实现

资助包维护!
robertlemke

安装次数: 63,188

依赖项: 2

建议者: 0

安全性: 0

星星: 5

关注者: 5

分支: 8

开放问题: 3

类型:neos-package

v4.1.0-beta.2 2024-01-18 09:22 UTC

README

MIT license Packagist Maintenance level: Love

Flow 框架的 OAuth 2.0 客户端

Flow 包提供 OAuth 2.0 客户端 SDK。尽管它可以作为通用 OAuth2 客户端使用,但它被开发为 OpenID Connect 包 的支持库。这就是为什么目前该包的文档较为简略,并且缺少通用用途的示例。

截至写作时(2020 年 11 月),此包正在积极维护,并计划改进功能、测试覆盖率和文档。

授权

此包将状态和令牌存储在专用数据库表中作为“授权”。

例如,在授权代码流程中,此包需要跟踪“状态”,以便对传入的“完成授权”请求进行理解。另一个例子是客户端凭证流程,其中访问令牌存储在授权表中,这是执行授权请求到相应服务所需的。

令牌有效期

默认情况下,新授权令牌的生存期为 600 秒(10 分钟)。如果 OAuth2 访问令牌中指定了不同的 expires 参数,则更新过期日期。

默认令牌有效期限和自动删除过期令牌的频率可以配置

Flownative:
  OAuth2:
    Client:
      garbageCollection:
        # The probability in percent of a client shutdown triggering a garbage
        # collection which removes expired tokens.
        #
        # Examples:
        #    1    (would be a 1% chance to clean up)
        #   20    (would be a 20% chance to clean up)
        #    0.42 (would be a 0.42 % chance to clean up)
        probability: 1
    token:
      # default lifetime of new tokens in seconds
      defaultLifetime: 600

注意:将 defaultLifetime 设置为 null,新令牌默认不会过期。

授权元数据

授权还可以包含开发人员提供的元数据。例如,您可以在授权流程开始时将账户标识符附加到授权,并在授权完成时使用该信息以确保授权仅用于特定账户(或客户编号,或参与者编号)。

设置元数据时,您需要在启动授权代码流程时知道授权 ID。此代码可以用作重载的 startAuthorizationAction()

$authorizationId = $oAuthClient->generateAuthorizationIdForAuthorizationCodeGrant($this->appId);
$loginUri = $oAuthClient->startAuthorizationWithId(
    $authorizationId,
    $this->appId,
    $this->appSecret,
    $returnToUri,
    $scope
);
$oAuthClient->setAuthorizationMetadata($authorizationId, json_encode($metadata));

稍后,在 finishAuthorization() 中,您可以通过以下方式检索元数据

$authorization = $this->getAuthorization($authorizationId);
$metadata = json_decode($authorization->getMetadata());

加密

默认情况下,访问令牌在“授权”数据库表中序列化和未加密存储。您可以通过启用此包的加密功能来提高应用程序的安全性。当启用时,它将在存储到数据库之前加密令牌,并在检索时自动解密。加密和解密所需的密钥不在数据库中存储。

此包使用“ChaCha20-Poly1305-IETF”构造进行序列化令牌的认证加密/解密。如果已安装,则使用 “sodium” PHP 扩展,或者使用纯 PHP 的 polyfill 实现

生成密钥

OAuth2 流包提供生成适合当前支持的加密方法的加密密钥的 CLI 命令

$ ./flow oauth:generateencryptionkey
qpBzrH7icQqBKenvk8wTKROv4qcJNxslzdGo3IKXmws=

密钥使用 base64 编码,以便简化处理,并通过 Flow 设置传递密钥。

启用加密

通过流设置(例如在您的全局 "配置/Settings.yaml" 中)设置加密密钥。请确保安全地部署此设置,例如在部署期间创建设置文件或使用环境变量。

Flownative:
  OAuth2:
    Client:
      encryption:
        base64EncodedKey: 'qpBzrH7icQqBKenvk8wTKROv4qcJNxslzdGo3IKXmws='

验证加密配置

当您设置加密密钥后,测试一切是否按预期工作。运行您的应用程序以创建新的授权。检查数据库表 flownative_oauth2_client_authorization:列 serializedaccesstoken 应为空,而列 encryptedserializedaccesstoken 应包含一个类似的长字符串

ChaCha20-Poly1305-IETF$Mjdj4s9IFrPp6HFK$k9v3x…KQ==

该字符串分为三个部分,由两个美元符号分隔

  1. 用于加密的构造("ChaCha20-Poly1305-IETF")
  2. 用于此特定条目的nonce("Mjdj4s9IFrPp6HFK")
  3. 加密数据("k9v3x…KQ==")