使用新的 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 和密钥获取新的访问令牌。 请参阅 “获取初始访问令牌 ”。