跳到主要内容
版本:3.10.x

配置动态客户端注册(DCR)

动态客户端注册(DCR)允许开发者通过开发者门户以编程方式注册 OAuth 2.0 客户端,无需在身份提供商中手动创建客户端。当开发者创建 OAuth 凭证时,门户会自动向已配置的 DCR 提供商注册客户端,并返回客户端 ID 和密钥。

前置条件

按照从控制台获取令牌中的步骤创建令牌,并将其导出为环境变量:

export API_KEY="a7ee-xxxxxxxxxxxxx"

DCR 提供商类型

API7 支持两种类型的 DCR 提供商:

OIDC

OIDC 提供商类型使用标准 RFC 7591RFC 7592 协议。门户通过身份提供商的 .well-known/openid-configuration 端点发现注册端点。

支持的操作:

操作协议描述
注册客户端RFC 7591向注册端点发送 POST 请求。
更新客户端RFC 7592使用 registration_access_tokenregistration_client_uri 发送 PUT 请求。
删除客户端RFC 7592registration_client_uri 发送 DELETE 请求。
轮换密钥不支持OIDC 提供商不支持密钥轮换。

HTTP 桥

HTTP 桥接提供商类型使用自定义 API 与不支持标准 DCR 协议的身份提供商通信。你需要部署 HTTP 桥接服务,在门户 API 和身份提供商之间转换请求。

支持的操作:

操作方法端点
注册客户端POST{base_url}/clients
更新客户端PUT{base_url}/clients/{client_id}
删除客户端DELETE{base_url}/clients/{client_id}
轮换密钥POST{base_url}/clients/{client_id}/rotate-secret

创建 DCR 提供商

OIDC 提供商

curl -k "https://localhost:7443/api/dcr_providers" \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "Keycloak Production",
"provider_type": "oidc",
"issuer": "https://keycloak.example.com/realms/my-realm",
"headers": {
"Authorization": "Bearer <initial-access-token>"
},
"desc": "Production Keycloak instance for OAuth client registration"
}'

如果不在本地运行,请将 localhost 替换为控制台主机。如果控制台使用自签名 TLS 证书,则需要 -k 参数。

name 是 DCR 提供商在 Provider Portal 中显示的名称。

provider_type 选择集成类型。使用 oidc 进行标准 OpenID Connect 动态客户端注册。

❸ OIDC 提供商必须配置 issuer。API7 从发行者的 /.well-known/openid-configuration 文档中发现注册端点。

headers 允许你随每个 DCR 请求发送自定义请求头,例如 Keycloak 的初始访问令牌。

desc 是可选的,可帮助运维人员了解该提供商的用途。

HTTP 桥接提供商

curl -k "https://localhost:7443/api/dcr_providers" \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "Custom OAuth Bridge",
"provider_type": "http_bridge",
"issuer": "https://issuer.example.com",
"provider_config": {
"base_url": "https://oauth-bridge.internal.example.com"
},
"headers": {
"X-API-Key": "<bridge-api-key>"
}
}'

name 是 DCR 提供商在 Provider Portal 中显示的名称。

provider_type: "http_bridge" 指示 API7 使用桥接服务,而不是标准 OIDC DCR 发现。

issuer 标识桥接服务所代表的 OAuth 发行者。

provider_config.base_url 是 HTTP 桥接提供商所必需的,并指向你的桥接服务。

headers 允许你将身份认证信息(例如 API Key(API 密钥))发送到桥接服务。

使用 DCR 配置 API 产品

创建 DCR 提供商后,在 API 产品的身份认证配置中引用它:

curl -k -X PATCH "https://localhost:7443/api/api_products/{product_id}?portal_id={portal_id}" \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '[
{
"op": "replace",
"path": "/auth",
"value": {
"dcr": {
"dcr_provider_id": "<dcr-provider-id>"
}
}
}
]'

你可以同时启用 DCR 和其他身份认证类型(API Key 身份认证、基本身份认证)。

示例:Keycloak 集成

以下步骤演示了将 Keycloak 集成为 DCR 提供商:

  1. 在 Keycloak 中创建初始访问令牌

    • 登录 Keycloak Admin Console。
    • 转到当前 realm 的 Clients > Initial Access Tokens
    • 创建具有所需到期时间和最大客户端数量的令牌。
  2. 在 API7 中创建 DCR 提供商

    curl -k "https://localhost:7443/api/dcr_providers" \
    -H "X-API-KEY: ${API_KEY}" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "Keycloak",
    "provider_type": "oidc",
    "issuer": "https://keycloak.example.com/realms/my-realm",
    "headers": {
    "Authorization": "Bearer <keycloak-initial-access-token>"
    }
    }'
  3. 创建启用 DCR 身份认证的 API 产品并发布。

  4. 开发者在开发者门户中创建 OAuth 凭证。每个凭证创建都会在 Keycloak 中注册一个新客户端。

  5. 开发者使用客户端 ID 和密钥向 Keycloak 请求访问令牌,然后使用令牌通过网关调用 API。

删除保护

在以下情况下,无法删除 DCR 提供商:

  • 任何 API 产品在身份认证配置中引用该提供商。
  • 任何开发者凭证都与其关联。

删除 DCR 提供商前,请先移除所有引用。

OIDC 发现缓存

对于 OIDC 提供商,门户会缓存 OpenID Connect 发现文档(其中包含注册端点 URL)。缓存采用 LRU 策略,TTL 为 24 小时,最多保留 128 个条目,以减少发送到身份提供商的发现请求数量。

其他资源