使用 Keycloak 配置动态客户端注册(DCR)
动态客户端注册(Dynamic Client Registration, DCR)是一种 OAuth 2.0 机制,允许客户端应用程序以编程方式向授权服务器进行注册,而无需在身份提供商(IdP)中进行手动配置。应用程序无需预先创建凭证,而是在运行时根据定义的注册策略接收 Client ID 和 Client Secret,从而实现可扩展的自动化接入。
在 API7 门户中,动态客户端注册(DCR)可以自动执行 OAuth 客户端注册流程:
- 管理员向 API7 提供来自 Keycloak 的初始 Access Token,该 Token 允许 API7 调用 Keycloak 的注册 API。
- 开发者直接在开发者门户中添加 OAuth 客户端,无需在 Keycloak 中手动创建客户端。
- API7 使用初始 Access Token 在 Keycloak 中动态创建 OAuth 客户端。
本指南将介绍如何使用 DCR 将 API7 企业版开发者门户与 Keycloak(作为身份提供商 IdP)集成。你将在提供方门户中发布 API,为 DCR 配置 Keycloak,然后使用开发者门户创建应用程序、订阅 API 并获取 OAuth 2.0 Access Token 以安全地消费 API。
前置条件
- 已安装并激活带有门户许可证的 API7 企业版 v3.9.0 或更高版本。如果你使用的 是试用许可证,则门户默认启用。请参阅安装 API7 企业版。
- 已部署并配置开发者门户。
- 已部署并可访问的 Keycloak。本指南使用
quay.io/keycloak/keycloak:21.1.1镜像进行测试。不同版本的 Keycloak 行为可能有所不同,因此如果你使用的是其他版本,请根据需要调整步骤。
配置提供方门户
在本节中,你将在 API7 提供方门户中配置 DCR 提供方并创建 API 产品。
发布服务
- 遵循发布你的第一个 API 创建服务和路由。
- 为路由添加标签(Label),例如
portal:dcr:require_any_scopes: phone。请求 Access Token 时,请求中指定的scope必须与路由标签中设置的值匹配。

配置 DCR 提供方
- 在你的 Keycloak 领域(Realm,例如
master)中,创建一个 初始 Access Token。 - 在提供方门户中,导航到 DCR 提供方(DCR Providers) 并点击 添加 DCR 提供方(Add DCR Provider)。
- 填写 DCR 提供方详情:
- 名称(Name):输入提供方的描述性名称。
- Issuer:输入 Keycloak Issuer URL。
- Auth Headers:输入
Authorization作为 Header 名称,值为Bearer ${ACCESS_TOKEN}。请将你的 Keycloak 初始 Access Token 替换进去。

创建 API 产品
-
导航到 API 产品(API Products) 并点击 添加 API 产品(Add API Product)。选择 从 API7 网关(From API7 Gateway) 创建产品。
-
配置 API 产品:
- 名称(Name):输入 API 产品的描述性名称。
- 身份验证类型(Authentication Type):选择 DCR。
- DCR 提供方(DCR Provider):选择先前配置的 Keycloak 提供方。
- 添加关联的网关服务(Add Linked Gateway Service):选择网关组和先前发布的服务(例如
httpbin)。

配置完成后,点击 添加(Add)。
-
新创建的 API 产品默认处于
草稿(draft)状态,在开发者门户中不可见。若要发布产品,请点击右上角的 操作(Actions),然后选择 发布(Publish),使 API 产品在开发者门户中可见。
开发者门户操作
以下说明假定你的开发者门户是基于 API7 开发者门户脚手架构建的。如果你的开发者门户已进行自定义,请相应调整步骤。
订阅 API 产品
作为 API 开发者:
- 注册一个新用户和组织。
- 使用开发者帐户登录到开发者门户。
- 导航到 My Applications 并点击 Add Application 以创建应用程序。
- 从顶部导航栏选择 API Hub。
- 选择一个 API 产品(例如
httpbin)。浏览 API 详情以确保其满足你的需求。 - 点击 Subscriptions,然后点击 Subscribe to Application,并选择先前创建的应用程序。
- 等待订阅请求获得批准。
批准订阅请求
仅当在创建 API 产品时禁用了 订阅自动批准(Subscription Auto Approval) 才需要批准。如果开发者的订阅会自动批准,请跳过此部分。
作为 API 提供方:
- 在提供方门户中,从顶部导航栏选择 组织(Organization),然后点击 审批(Approvals)。
- 找到对应的请求并点击 接受(Accept)。
创建应用程序和 OAuth 客户端
作为 API 开发者:
- 导航到 My Applications 并选择之前创建的应用程序。
- 转到 Authentication Type 选项卡并点击 OAuth。
- 点击 Add OAuth Client 以创建新的 OAuth 客户端。
- 填写 OAuth 客户端详情:
- Identity Provider:选择 Keycloak 作为 OAuth 提供商。
- Redirect URIs:输入回调 URL。这些重定向 URI 将通过 DCR 自动配置在 Keycloak 客户端中。
- 复制 Client ID 和 Client Secret 以供后续验证。
在 开发者门户中创建的每个 OAuth 客户端映射到 Keycloak 中的单个客户端。一个应用程序可以包含多个 OAuth 客户端,每个客户端都有其对应的 Keycloak 客户端。
验证 API 访问
作为 API 开发者:
-
请求 Access Token。此处请求的
scope必须与路由标签中设置的值(在本例中为phone)相对应,否则验证将失败。# Define variables
export KEYCLOAK_HOST="your_keycloak_host"
export ADMIN_USERNAME="your_admin_username"
export ADMIN_PASSWORD="your_admin_password"
export CLIENT_ID="your_client_id"
export CLIENT_SECRET="your_client_secret"
export DP_HOST="your_dp_host"
export KEYCLOAK_REALM="your_realm"
# Request the access token
export ACCESS_TOKEN="$(curl --location --request POST "http://${KEYCLOAK_HOST}:8080/realms/${KEYCLOAK_REALM}/protocol/openid-connect/token" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode "client_id=${CLIENT_ID}" \
--data-urlencode "client_secret=${CLIENT_SECRET}" \
--data-urlencode "username=${ADMIN_USERNAME}" \
--data-urlencode "password=${ADMIN_PASSWORD}" \
--data-urlencode 'scope=phone' | jq -r '.access_token')" -
使用获取的 Access Token 调用 API:
# Update with your gateway address
curl "http://127.0.0.1:9080/ip" -H "Host: httpbin.org" -H "Authorization: Bearer $ACCESS_TOKEN"你应该会看到以下响应:
{
"origin": "127.0.0.1"
}