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

使用 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。

前置条件

  1. 已安装并激活带有门户许可证的 API7 企业版 v3.9.0 或更高版本。如果你使用的是试用许可证,则门户默认启用。请参阅安装 API7 企业版
  2. 已部署并配置开发者门户
  3. 已部署并可访问的 Keycloak。本指南使用 quay.io/keycloak/keycloak:21.1.1 镜像进行测试。不同版本的 Keycloak 行为可能有所不同,因此如果你使用的是其他版本,请根据需要调整步骤。

配置提供方门户

在本节中,你将在 API7 提供方门户中配置 DCR 提供方并创建 API 产品。

发布服务

  1. 遵循发布你的第一个 API 创建服务和路由。
  2. 为路由添加标签(Label),例如 portal:dcr:require_any_scopes: phone。请求 Access Token 时,请求中指定的 scope 必须与路由标签中设置的值匹配。

Add a label for the route

配置 DCR 提供方

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

Add DCR provider

创建 API 产品

  1. 导航到 API 产品(API Products) 并点击 添加 API 产品(Add API Product)。选择 从 API7 网关(From API7 Gateway) 创建产品。

  2. 配置 API 产品:

    • 名称(Name):输入 API 产品的描述性名称。
    • 身份验证类型(Authentication Type):选择 DCR
    • DCR 提供方(DCR Provider):选择先前配置的 Keycloak 提供方。
    • 添加关联的网关服务(Add Linked Gateway Service):选择网关组和先前发布的服务(例如 httpbin)。

    Add API Product

    配置完成后,点击 添加(Add)

  3. 新创建的 API 产品默认处于 草稿(draft) 状态,在开发者门户中不可见。若要发布产品,请点击右上角的 操作(Actions),然后选择 发布(Publish),使 API 产品在开发者门户中可见。

    Publish Product

开发者门户操作

以下说明假定你的开发者门户是基于 API7 开发者门户脚手架构建的。如果你的开发者门户已进行自定义,请相应调整步骤。

订阅 API 产品

作为 API 开发者:

  1. 注册一个新用户和组织
  2. 使用开发者帐户登录到开发者门户。
  3. 导航到 My Applications 并点击 Add Application 以创建应用程序。
  4. 从顶部导航栏选择 API Hub
  5. 选择一个 API 产品(例如 httpbin)。浏览 API 详情以确保其满足你的需求。
  6. 点击 Subscriptions,然后点击 Subscribe to Application,并选择先前创建的应用程序。
  7. 等待订阅请求获得批准。

批准订阅请求

仅当在创建 API 产品时禁用了 订阅自动批准(Subscription Auto Approval) 才需要批准。如果开发者的订阅会自动批准,请跳过此部分。

作为 API 提供方:

  1. 在提供方门户中,从顶部导航栏选择 组织(Organization),然后点击 审批(Approvals)
  2. 找到对应的请求并点击 接受(Accept)

创建应用程序和 OAuth 客户端

作为 API 开发者:

  1. 导航到 My Applications 并选择之前创建的应用程序。
  2. 转到 Authentication Type 选项卡并点击 OAuth
  3. 点击 Add OAuth Client 以创建新的 OAuth 客户端。
  4. 填写 OAuth 客户端详情:
    • Identity Provider:选择 Keycloak 作为 OAuth 提供商。
    • Redirect URIs:输入回调 URL。这些重定向 URI 将通过 DCR 自动配置在 Keycloak 客户端中。
  5. 复制 Client IDClient Secret 以供后续验证。
信息

在开发者门户中创建的每个 OAuth 客户端映射到 Keycloak 中的单个客户端。一个应用程序可以包含多个 OAuth 客户端,每个客户端都有其对应的 Keycloak 客户端。

验证 API 访问

作为 API 开发者:

  1. 请求 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')"
  2. 使用获取的 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"
    }