使用 Keycloak 作为 OAuth 2.0 服务器
使用 Keycloak 作为 OAuth 2.0 服务器
本指南介绍如何为 RabbitMQ 和 Keycloak 设置 OAuth 2.0 作为授权服务器,使用以下流程
- 通过浏览器访问 管理界面
- 访问管理 HTTP API
- 应用程序身份验证和授权
Keycloak JWT 载荷
Keycloak 可以颁发两种类型的 JWT 载荷。
一种载荷类型存在于 请求方令牌 中。RabbitMQ 支持这种类型的令牌,并从中提取作用域。您无需进行任何配置。
第二种载荷类型如下
{
"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 不会从中读取作用域。例如,要配置 RabbitMQ 从 realm_access 声明下的 roles 中提取作用域,请添加以下配置变量
auth_oauth2.additional_scopes_key = realm_access.roles
要配置 RabbitMQ 也从 resource_access 声明中读取,请按以下方式编辑之前的配置
auth_oauth2.additional_scopes_key = realm_access.roles resource_access.account.roles
最后,如果您还想使用 roles 声明中的作用域,请编辑之前的配置
auth_oauth2.additional_scopes_key = roles realm_access.roles resource_access.account.roles
RabbitMQ 会从所有这些来源读取作用域。
遵循本指南的先决条件
-
Docker
-
make
-
一个包含本示例中使用的所有配置文件和脚本的 GitHub 仓库 的本地克隆,分支为
next -
将以下条目添加到
/etc/hostslocalhost keycloak rabbitmq
部署 Keycloak
-
首先,部署 Keycloak。它预装了所有必需的作用域、用户和客户端。
-
通过运行以下命令启动 Keycloak 服务器
make start-keycloak
有一个名为 Test 的专用 Keycloak 领域,配置如下
- 一个 rsa 签名密钥。访问 Keycloak 管理页面时,系统提示输入凭据,请使用
admin:admin。 - 一个 rsa 提供程序
- 三个客户端:
rabbitmq-client-code用于 RabbitMQ 管理 UI,mgt_api_client用于通过管理 API 访问,producer用于通过 AMQP 协议访问。
启动 RabbitMQ
运行以下命令以启动与上一节中启动的 Keycloak 服务器配置的 RabbitMQ:这是用于 Keycloak 的 rabbitmq.conf。
export MODE=keycloak
make start-rabbitmq
RabbitMQ 已部署并启用了 TLS,Keycloak 已配置相应的 redirect_url,该 URL 使用 HTTPS。
RabbitMQ 已配置为从自定义声明 extra_scope 中读取作用域,并默认从标准声明 scope 中读取。但是,如果您的作用域深埋在映射/列表结构中,例如 authorization.permissions.scopes,或位于 realm_access.roles 或 resource_access.account.roles 下,您可以配置 RabbitMQ 使用那些位置。有关更多信息,请参阅 为作用域使用不同的令牌字段 部分。
访问管理 API
要访问管理 API,请运行以下命令。它使用了具有 rabbitmq.tag:administrator 作用域的 mgt_api_client 客户端。
make curl-keycloak url=https://:15671/api/overview client_id=mgt_api_client secret=LWOuYqJ8gjKg3D2U8CJZDuID3KiRZVDa realm=test
使用 PerfTest 进行应用程序身份验证和授权
要使用 AMQP 协议测试 OAuth 2.0 身份验证,可以使用 RabbitMQ PerfTest 工具,该工具使用 RabbitMQ Java 客户端。
首先,您获取令牌并将其作为参数传递给 start-perftest-producer-with-token 目标。
make start-perftest-producer-with-token PRODUCER=producer TOKEN=$(bin/keycloak/token producer kbOFBXI9tANgKUq8vXHLhT6YhbivgXxn test)
使用令牌初始化应用程序有一个缺点:应用程序无法在令牌有效期之外使用该连接。请参阅下一节,其中演示了如何刷新令牌。
使用 Pika 进行应用程序身份验证和授权
在以下信息中,使用 AMQP 协议和 Pika 库测试 OAuth 2.0 身份验证。这些测试专门演示如何在活动的 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://:15671。
- 单击页面上的单个按钮,该按钮会重定向到 Keycloak 进行身份验证。
- 输入
rabbit_admin和rabbit_admin,您应该会被重定向回 RabbitMQ Management,并已完全登录。
停止 Keycloak
make stop-keycloak
关于设置 Keycloak 的说明
配置客户端
对于使用 **客户端凭据流** 的后端应用程序,您可以创建一个 **客户端**,并具有以下设置:
- 访问类型:
public - 关闭
Standard Flow、Implicit Flow和Direct Access Grants。 - 启用 **Service Accounts Enabled**。如果未启用,您将看不到
Credentials选项卡。 - 在
Credentials选项卡中,您会找到client id。
配置客户端作用域
默认客户端作用域 是自动授予每个令牌的作用域。而可选客户端作用域 是仅在授权/令牌请求流程中明确请求时才授予的作用域。
包含适当的 aud 声明
您必须配置一个 **Hardcoded claim** 类型的 **Token Mapper**,值为 RabbitMQ 的 resource_server_id。您可以将 **Token Mapper** 配置到 **Client scope** 或 **Client**。