flownative / oauth2-client
Flow 框架应用程序的通用 OAuth2 客户端基本实现
Requires
- php: 8.0.* || 8.1.* || 8.2.* || 8.3.*
- guzzlehttp/guzzle: ^6.0 || ^7.0
- league/oauth2-client: ^2.0
- neos/flow: ^6.0 || ^7.0 || ^8.0 || ^9.0
- paragonie/sodium_compat: ^1.10
- ramsey/uuid: ^3.0 || ^4.0
This package is auto-updated.
Last update: 2024-09-18 10:53:03 UTC
README
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==
该字符串分为三个部分,由两个美元符号分隔
- 用于加密的构造("ChaCha20-Poly1305-IETF")
- 用于此特定条目的nonce("Mjdj4s9IFrPp6HFK")
- 加密数据("k9v3x…KQ==")