跳到主要内容
版本: 4.1

使用 Keycloak 作为 OAuth 2.0 服务器

使用 Keycloak 作为 OAuth 2.0 服务器

本指南解释了如何为 RabbitMQ 设置 OAuth 2.0,并使用 Keycloak 作为授权服务器,使用以下流程

  • 通过浏览器访问管理 UI
  • 访问管理 HTTP API
  • 应用程序身份验证和授权

Keycloak JWT 负载

Keycloak 可以颁发两种类型的 JWT 负载。

一种类型的负载在请求方令牌中找到。RabbitMQ 支持这种类型的令牌,并从中提取 scopes。您无需配置任何内容。

第二种类型的负载如下

{
"realm_access": {
"roles": [
"offline_access",
"uma_authorization",
"rabbitmq.tag:management",
]
},
"resource_access": {
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile",
"rabbitmq.write:*/*"
]
}
},
"roles": "rabbitmq.read:*/*",
"scope": "profile email"
}
信息

声明 roles 严格来说不是 Keycloak 官方声明的一部分。相反,它是用户从 Keycloak 管理控制台配置的自定义声明。

除非您配置 RabbitMQ 这样做,否则 RabbitMQ 不会从此令牌中读取 scopes。例如,要配置 RabbitMQ 从 realm_access 声明下的 roles 中提取 scopes,请添加以下配置变量

auth_oauth2.additional_scopes_key = realm_access.roles

要配置 RabbitMQ 也从 resource_access 声明中读取,请按如下方式编辑之前的配置

auth_oauth2.additional_scopes_key = realm_access.roles resource_access.account.roles

最后,如果您还想使用声明 roles 中的 scopes,请编辑之前的配置

auth_oauth2.additional_scopes_key = roles realm_access.roles resource_access.account.roles

RabbitMQ 从所有这些来源读取 scopes。

遵循本指南的先决条件

  • Docker

  • make

  • GitHub 存储库GitHub repository 的本地克隆,用于 next 分支,其中包含本示例中使用的所有配置文件和脚本

  • 将以下条目添加到 /etc/hosts

    localhost keycloak rabbitmq

部署 Keycloak

  1. 首先,部署 Keycloak。它已预配置了所有必需的 scopes、用户和客户端。

  2. 通过运行以下命令启动 Keycloak 服务器

    make start-keycloak

有一个名为 Test 的专用 Keycloak realm,配置如下

  • rsa 签名密钥。当提示输入凭据以访问 Keycloak 管理页面时,使用 admin:admin
  • rsa 提供程序
  • 三个客户端:用于 RabbitMQ 管理 UI 的 rabbitmq-client-code,用于通过管理 API 访问的 mgt_api_client,以及用于通过 AMQP 协议访问的 producer

启动 RabbitMQ

运行以下命令以启动配置了我们在上一节中启动的 Keycloak 服务器的 RabbitMQ:这是用于 Keycloak 的 rabbitmq.conf

export MODE=keycloak
make start-rabbitmq
信息

RabbitMQ 部署时启用了 TLS,Keycloak 配置了相应的 redirect_url,该 URL 使用 HTTPS。

重要提示

RabbitMQ 配置为从自定义声明 extra_scope 和默认的 standard claim scope 中读取 scopes。但是,如果您的 scopes 深藏在 map/list 结构中,例如 authorization.permissions.scopes,或者在 realm_access.rolesresource_access.account.roles 下,您可以配置 RabbitMQ 以使用这些位置代替。有关更多信息,请参阅使用不同的令牌字段作为 scope部分。

访问管理 API

要访问管理 API,请运行以下命令。它使用客户端 mgt_api_client,该客户端具有 scope rabbitmq.tag:administrator

make curl-keycloak url=https://localhost:15671/api/overview client_id=mgt_api_client secret=LWOuYqJ8gjKg3D2U8CJZDuID3KiRZVDa realm=test

使用 PerfTest 进行应用程序身份验证和授权

要使用 AMQP 协议测试 OAuth 2.0 身份验证,您可以使用 RabbitMQ PerfTest 工具,该工具使用 RabbitMQ Java Client。

首先,您获取令牌并将其作为参数传递给 make 目标 start-perftest-producer-with-token

make start-perftest-producer-with-token PRODUCER=producer TOKEN=$(bin/keycloak/token producer kbOFBXI9tANgKUq8vXHLhT6YhbivgXxn test)
信息

使用令牌初始化应用程序有一个缺点:应用程序无法在令牌的生命周期之外使用连接。请参阅下一节,其中演示如何刷新令牌。

使用 Pika 进行应用程序身份验证和授权

在以下信息中,OAuth 2.0 身份验证使用 AMQP 协议和 Pika 库进行测试。这些测试专门演示了如何在活动的 AMQP 连接上刷新令牌。

示例 Python 应用程序在 GitHub 上

要运行此示例代码,请按如下步骤操作

python3 --version
pip install pika
pip install requests
python3 pika-client/producer.py producer kbOFBXI9tANgKUq8vXHLhT6YhbivgXxn
提示

如果 pip 不可用,请尝试以下两个命令来安装它

python3 -m venv venv
source venv/bin/activate
重要提示

确保您安装了 pika 1.3。

访问管理 UI

  1. 转到 https://localhost:15671
  2. 单击页面上的单个按钮,该按钮将重定向到 Keycloak 进行身份验证。
  3. 输入 rabbit_adminrabbit_admin,您应该被重定向回 RabbitMQ Management 并完全登录。

停止 Keycloak

make stop-keycloak

关于设置 Keycloak 的注意事项

配置客户端

对于使用客户端凭证流的后端应用程序,您可以创建一个客户端,其中

  • 访问类型public
  • 关闭 Standard FlowImplicit FlowDirect Access Grants
  • 启用服务帐户。如果未启用,您将没有 Credentials 选项卡
  • Credentials 选项卡中,您有 client id

配置客户端 scopes

默认客户端 Scope 是自动授予每个令牌的 scopes。而可选客户端 Scope 是仅在授权/令牌请求流程期间显式请求时才授予的 scopes。

包含适当的 aud 声明

您必须配置类型为硬编码声明Token Mapper,其值为 RabbitMQ 的 resource_server_id。您可以将 Token Mapper 配置为客户端 scope客户端

© . All rights reserved.