使用 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
-
首先,部署 Keycloak。它已预配置了所有必需的 scopes、用户和客户端。
-
通过运行以下命令启动 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.roles
或 resource_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
- 转到 https://localhost:15671。
- 单击页面上的单个按钮,该按钮将重定向到 Keycloak 进行身份验证。
- 输入
rabbit_admin
和rabbit_admin
,您应该被重定向回 RabbitMQ Management 并完全登录。
停止 Keycloak
make stop-keycloak
关于设置 Keycloak 的注意事项
配置客户端
对于使用客户端凭证流的后端应用程序,您可以创建一个客户端,其中
- 访问类型:
public
- 关闭
Standard Flow
、Implicit Flow
和Direct Access Grants
- 启用服务帐户。如果未启用,您将没有
Credentials
选项卡 - 在
Credentials
选项卡中,您有client id
配置客户端 scopes
默认客户端 Scope 是自动授予每个令牌的 scopes。而可选客户端 Scope 是仅在授权/令牌请求流程期间显式请求时才授予的 scopes。
包含适当的 aud 声明
您必须配置类型为硬编码声明的 Token Mapper,其值为 RabbitMQ 的 resource_server_id
。您可以将 Token Mapper 配置为客户端 scope 或客户端。