跳至主内容
版本:4.2

使用 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/hosts

    localhost keycloak rabbitmq

部署 Keycloak

  1. 首先,部署 Keycloak。它预装了所有必需的作用域、用户和客户端。

  2. 通过运行以下命令启动 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.rolesresource_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

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

停止 Keycloak

make stop-keycloak

关于设置 Keycloak 的说明

配置客户端

对于使用 **客户端凭据流** 的后端应用程序,您可以创建一个 **客户端**,并具有以下设置:

  • 访问类型public
  • 关闭 Standard FlowImplicit FlowDirect Access Grants
  • 启用 **Service Accounts Enabled**。如果未启用,您将看不到 Credentials 选项卡。
  • Credentials 选项卡中,您会找到 client id

配置客户端作用域

默认客户端作用域 是自动授予每个令牌的作用域。而可选客户端作用域 是仅在授权/令牌请求流程中明确请求时才授予的作用域。

包含适当的 aud 声明

您必须配置一个 **Hardcoded claim** 类型的 **Token Mapper**,值为 RabbitMQ 的 resource_server_id。您可以将 **Token Mapper** 配置到 **Client scope** 或 **Client**。

© . This site is unofficial and not affiliated with VMware.