使用新的 OpenID Connect提供程序进行动态客户端注册
动态客户机注册允许 OpenID Connect (OIDC) 依赖方 (RP) 向 OpenID Connect 提供者 (OP) 注册自身。
准备工作
该功能基于 OpenID Connect 动态客户端注册 1.0 规范。
新的 OIDC 应用程序由租户管理员或具有对租户的管理访问权的用户创建。 现在,还可以通过动态客户端注册来动态创建 OIDC 应用程序。
动态客户机注册端点位于以下位置:https://{{tenant}}/oauth2/register。
关于此任务
配置动态客户端注册设置,然后使用注册 API 动态注册新的 OIDC 应用程序。 该应用程序属于 "OpenID Connect"或 "OpenID Connect for Open Banking"应用之一。
动态客户端注册设置
可以配置动态客户端注册设置,以设定动态客户端注册的默认值。 请参阅 “配置 OIDC 动态客户端注册设置 ”。
下表介绍了相关设置。
| 字段 | 描述 |
|---|---|
| 授权类型 | 如果动态客户端注册负载中未指定,则应使用以下资助类型。 支持的授权类型包括“授权码”、“隐式授权”、“密码”、“刷新令牌”和“客户端凭据”。 如果开放银行配置项不为“无”,则不允许使用“密码”授权类型。 |
| 标识令牌声明 | 如果动态客户端注册负载中未指定,则默认获取 ID 令牌和用户信息。 |
| 令牌声明 | 如果动态客户端注册负载中未指定,则使用针对内省和 JWT 访问令牌的默认声明。 |
| 访问令牌类型 | 要生成的访问令牌的类型。 有效值为“默认”和“JWT”。 |
| 标识令牌签名算法 | 如果动态客户端注册负载中未指定,则使用该算法对 ID 令牌进行签名。 |
| 用户许可 | 选择是否在动态客户端注册负载中未指定时请求用户同意。 |
| 访问令牌生存期 | 访问令牌的有效期(以秒为单位)。 最大值为 2147483647,最小值为 1。 |
| 刷新令牌生命周期 | 刷新令牌的有效期(以秒为单位)。 最大值为 2147483647,最小值为 1。 |
| 实施 PKCE 验证 | 选择是否在动态客户端注册负载中未指定时强制执行 PKCE。 |
| 授予所有用户权限 | 如果动态客户端注册负载中未作指定,请确定所有用户是否都有权使用此客户端。 |
| 请求对象的有效期 | 请求对象的有效期(以秒为单位)。 最大值为 2147483647,最小值为 1。 |
| 请求对象需要“exp” | 确定请求对象中是否需要包含“exp”属性。 |
| 允许定制客户机凭证 | 确定是否允许使用自定义客户端凭据。 如果设置为“false”,则无法在动态客户端注册负载中指定客户端 ID 和密钥。 |
| 允许的请求对象签名算法 | 签名请求 JWT 允许使用的签名算法列表。 如果未设置,则允许使用所有受支持的算法。 |
| 请求变换规则 | 输入用于修改动态客户机注册请求的规则。 如果未设置,则不会对动态客户端注册请求进行任何修改。 |
| 开放银行配方 | 适用于所有动态客户注册的开放银行配置方案。 当此字段设置为“无”时,将创建一个 'OpenID Connect”应用程序。 如果设置为其他任何值,系统将创建一个名为“ 'OpenID Connect for Open Banking”的应用程序。 |
有关设置中的“软件声明”、“请求授权”和“注册访问令牌”部分,请参阅《 配置 OIDC 动态客户端注册设置》。
需要不记名令牌认证以进行动态客户机注册
如果请求授权配置为要求动态客户端注册时使用承载令牌授权,则需要初始访问令牌。
创建具有 Manage OIDC client registration dynamically 权利的 API 客户机。 要创建 API 客户端,请参阅《 管理应用程序的 API 访问权限 》。
创建 API 客户机后,使用 client_credentials 流以获取访问令牌。 以下代码为示例:
curl -ki -v https://{{tenant}}/v1.0/endpoint/default/token -d "grant_type=client_credentials&client_id=<clientId>&client_secret=<clientSecret>"
动态客户端注册请求要求在授权头中提供承载令牌。
需要 MTLS 以进行动态客户机注册
如果请求授权配置为要求双向 TLS ,则客户端必须在请求中提供有效的证书。
使用注册 API 注册新应用程序
下表显示当前支持的客户机元数据的列表。
| 元数据名称 | 元数据描述 | 可选 | 有效值 |
|---|---|---|---|
| client_name | 应用程序名称 | true | 字符串 |
| client_id | 如果未提供客户机标识,那么将自动生成客户机标识。 | true | 字符串 |
| client_secret | 如果未提供客户机密钥,那么将自动生成客户机密钥。 | true | 字符串 |
| redirect_uris | 重定向 URI 的列表。 | false | 字符串 URI 的列表 |
| grant_types | 应用程序可使用的授权类型的数组。 | true | “authorization_code”、“implicit”、“password”、“refresh_token”和“client_credentials” |
| id_token_signed_response_alg | 令牌签名算法。 | true | 'RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'PS256', 'PS384', 'PS512' |
| all_users_entitled | 如果所有用户都有权使用此应用程序,请设置为 true。 | true | true 或 false |
| jwks_uri | 客户机的 JSON Web 密钥集文档的 URL。 | true | URL |
| consent_action | 请求用户同意。 | true | “never_prompt”或“always_prompt” |
| enforce_pkce | 强制使用 PKCE。 | true | true 或 false |
| scope | 由空格分隔的允许作用域字符串。 | true | 字符串 |
| id_token_claims | d_token 和用户信息的声明列表。 | true | 字符串列表 |
| token_claims | 内省和 JWT 访问令牌的声明列表。 | true | 字符串列表 |
| initiate_login_uri | 用于启动登录的 URL。 | true | URL |
| 响应类型 | 此客户端使用的响应类型。 | true | 字符串列表 |
| token_endpoint_auth_method | 令牌端点的客户机认证方法。 | true | 'default'、'client_secret_basic'、'client_secret_post'、'private_key_jwt' 和 'tls_client_auth' |
| tls_client_auth_subject_dn | 客户端在 TLS 双向身份验证中使用的证书的预期主题区分名称。 | true | 字符串 |
| tls_client_auth_san_dns | 客户端在 TLS 双向身份验证中使用的证书中,预期的DNS名称SAN条目。 | true | 字符串 |
| tls_client_auth_san_uri | 客户端在 TLS 双向认证中使用的证书中预期的URI SAN条目。 | true | 字符串 |
| tls_client_auth_san_ip | 客户端在 TLS 双向认证中使用的证书中,预期的IP地址SAN条目。 | true | 字符串 |
| tls_client_auth_san_email | 证书中预期的电子邮件地址 SAN 条目,客户端在双向 TLS 身份验证中使用该条目。 | true | 字符串 |
| tls_client_certificate_bound_access_tokens | 指示是否需要访问令牌的证书绑定。 | true | true 或 false |
| userinfo_signed_response_alg | 用户信息响应的 JWT 签名算法。 | true | 'RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'PS256', 'PS384', 'PS512' |
| userinfo_encrypted_response_alg | 用户信息响应的JWT加密算法。 | true | “RSA-OAEP”、“ RSA-OAEP-256 ” |
| userinfo_encrypted_response_enc | 用户信息响应的JWT加密内容算法。 | true | 'A128GCM', 'A192GCM', 'A256GCM' |
注册新应用程序的示例
以下代码是一个示例请求,其中动态客户端注册已配置为需要 Bearer 令牌授权。
curl -ki -H "Authorization: bearer <access-token>" -H "Content-Type:application/json" -X POST https://{{tenant}}/oauth2/register --data-binary '{"redirect_uris":["https://www.redirect.com"],"client_name":"MyApplication"}'
响应
{
"grant_types": [
"authorization_code"
],
"client_secret_expires_at": "0",
"registration_client_uri": "https://{{tenant}}/oauth2/register/<clientId>",
"client_secret": "<client_secret>",
"redirect_uris": [
"https://www.redirect.com"
],
"client_id_issued_at": "1586933118",
"client_name": "MyApplication",
"registration_access_token": "<access_token>",
"client_id": "<clientId>",
"id_token_signed_response_alg": "RS256"
}
应用程序的进一步配置
创建应用程序后,您可以为其配置更多选项,例如属性映射、访问策略、身份来源、授权用户等。 要配置这些选项,请参阅 《在“ OpenID Connect”应用中配置单点登录》 或 《在“ OpenID Connect for Open Banking”应用中配置单点登录》。
使用注册 API 更新 OIDC 应用程序
以下代码演示了如何将上一步骤生成的授权承载令牌用作授权 registration_access_token 凭证,并发送 PUT 请求来修改客户端。 请注意,对 OIDC 应用程序配置所做的更改将会被覆盖。
curl -ki -H "Authorization: bearer <registration_access_token>" -H "Content-Type:application/json" -X PUT https://{{tenant}}/oauth2/register/<client-id> --data-binary '{"redirect_uris":["https://www.redirect.com/callback"],"client_name":"MyApplication2"}'
使用注册 API 读取 OIDC 应用程序
注册 API 还提供一种方式以重新读取 OIDC 应用程序。
curl -ki -H "Authorization: bearer <registration-access-token>" https://{{tenant}}/oauth2/register/<clientId>
使用注册 API 删除 OIDC 应用程序
注册 API 还提供一种方式以删除 OIDC 应用程序。
curl -ki -H "Authorization: bearer <registration-access-token>" -X DELETE https://{{tenant}}/oauth2/register/<clientId>
注册访问令牌已到期
如果注册访问令牌过期,请使用已注册客户端的客户端 ID 和密钥获取新的访问令牌。 请参阅 “获取初始访问令牌 ”。