使用 Keycloak 授权 M2M 请求
Keycloak 可以向与机密 OIDC 客户端关联的服务账号签发访问令牌。后台服务、定时任务、命令行工具和自动化程序可以使用这些令牌调用 API,而无需最终用户登录。
OAuth 2.0 客户端凭证授权专为这类机器到机器(M2M)通信设计。Apache APISIX 可以在代理请求之前验证每个令牌的签名、签发者、受众和已授予作用域,从而保护目标 API。
本指南使用一个 Keycloak 客户端表示由 APISIX 保护的 API,另一个服务账号客户端表示调用服务。服务账号会获得一个客户端作用域,并请求受众标识为受保护 API 的访问令牌。APISIX 会验证这两项限制,并在将请求转发到示例上游之前移除身份认证数据。主要配置使用 Keycloak 的 JSON Web Key Set(JWKS)在本地验证令牌;备选配置则使用 Keycloak 的令牌内省端点。
前置条件
配置 Keycloak
启动本地 Keycloak 服务器,然后创建 Realm、受保护 API 客户端、客户端作用域和用于 M2M 授权的服务账号客户端。
启动 Keycloak
如果已通过设置 Keycloak 单点登录准备好 Keycloak 和 quickstart-realm,请复用它们并继续创建 API 作用域。
否则,请使用临时管理员账号以开发模式启动 Keycloak:
docker run -d --name apisix-keycloak \
-e 'KC_BOOTSTRAP_ADMIN_USERNAME=quickstart-admin' \
-e 'KC_BOOTSTRAP_ADMIN_PASSWORD=quickstart-admin-pass' \
-p 8080:8080 \
quay.io/keycloak/keycloak:26.7.3 start-dev
开发模式和示例凭证仅用于本地测试。生产部署应使用 HTTPS、生产数据库和永久管理员账号。
打开 http://localhost:8080/admin/,使用管理员用户名 quickstart-admin 和密码 quickstart-admin-pass 登录。
创建 Realm
为本指南创建一个隔离的 Realm:
- 选择 Manage realms → Create realm。
- 输入
quickstart-realm作为 Realm 名称。 - 选择 Create。

创 建 API 作用域
创建 APISIX 将要求 M2M 访问令牌包含的作用域:
- 选择 Client scopes → Create client scope。
- 输入
apisix.read作为名称,并保持 Protocol 为 OpenID Connect。 - 开启 Include in token scope,然后选择 Save。
创建受保护 API 客户端
创建一个表示 APISIX 所保护 API 的机密客户端:
- 选择 Clients → Create client。
- 保持 Client type 为 OpenID Connect,输入
apisix-protected-api作为客户端 ID,然后选择 Next。 - 开启 Client authentication。关闭所有身份认证流程,然后选择 Save。
APISIX 使用此客户端 ID 作为预期令牌受众。只有可选的令牌内省配置需要客户端密钥。
创建 M2M 客户端
创建一个带有 Keycloak 服务账号的机密客户端:
- 选择 Clients → Create client。
- 保持 Client type 为 OpenID Connect,输入
apisix-m2m-client作 为客户端 ID,然后选择 Next。 - 开启 Client authentication 和 Service account roles。关闭 Standard flow 和其他身份认证流程,然后选择 Save。
- 打开 Client scopes 标签页,然后选择 Add client scope。
- 选择
apisix.read,选择 Add,并将其添加为可选客户端作用域。
服务账号使此客户端能够通过客户端凭证授权获取令牌。该流程不会重定向浏览器,也不会对最终用户进行身份认证,因此不需要重定向 URI。
添加令牌受众
将受保护 API 客户端添加为签发给 M2M 客户端的访问令牌受众:
- 打开 Clients → apisix-m2m-client → Client scopes。
- 选择
apisix-m2m-client-dedicated,然后选择 Add mapper → By configuration → Audience。 - 输入
apisix-audience作为名称,并选择apisix-protected-api作为包含的客户端受众。 - 保持 Add to access token 开启,然后选择 Save。

访问令牌的 aud 声明将包含 apisix-protected-api。这可以区分调用服务与受保护 API,并让 APISIX 拒绝为其他受众签发的令牌。