跳至主要内容
版本: 4.0

使用 Keycloak 作为 OAuth 2.0 服务器

本指南说明了如何使用以下流程为 RabbitMQ 和 Keycloak 作为授权服务器设置 OAuth 2.0

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

遵循本指南的先决条件

  • Docker
  • make
  • 一个 GitHub 仓库 的本地克隆,其中包含本示例中使用的所有配置文件和脚本

部署 Keycloak

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

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

    make start-keycloak

有一个名为 `Test` 的专用 **Keycloak 领域**,配置如下

  • 一个 rsa 签名密钥
  • 一个 rsa 提供者
  • 三个客户端:`rabbitmq-client-code` 用于 rabbitmq 管理 UI、`mgt_api_client` 用于通过管理 API 访问以及 `producer` 用于通过 AMQP 协议访问。

启动 RabbitMQ

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

export MODE=keycloak
make start-rabbitmq

访问管理 API

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

make curl-keycloak url=https://127.0.0.1:15672/api/overview client_id=mgt_api_client secret=LWOuYqJ8gjKg3D2U8CJZDuID3KiRZVDa

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

要使用 RabbitMQ PerfTest 工具(使用 RabbitMQ Java 客户端)测试使用 AMQP 协议进行 OAuth 2.0 身份验证,您将需要这样做。

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

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

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

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

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

示例 Python 应用程序 可以在 GitHub 上找到

要运行此示例代码,请执行以下操作

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

注意:确保安装了 pika 1.3

访问 管理 UI

  1. 转到 https://127.0.0.1:15672
  2. 单击页面上的单个按钮,该按钮会重定向到 **Keycloak** 以进行身份验证。
  3. 输入 `rabbit_admin` 和 `rabbit_admin`,您应该会重定向回完全登录的 RabbitMQ 管理。

停止 Keycloak

make stop-keycloak

有关设置 Keycloak 的说明

配置客户端

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

  • **访问类型**:`public`
  • 关闭 `标准流`、`隐式流` 和 `直接访问授权`
  • 启用 **服务帐户**。如果未启用,则没有 `凭据` 选项卡
  • 在 `凭据` 选项卡中,您有 `client id`

配置客户端范围

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

包含适当的 aud 声明

您必须配置一个类型为 **硬编码声明** 的 **令牌映射器**,其值为 rabbitmq 的 *resource_server_id*。您可以将 **令牌映射器** 配置为 **客户端范围** 或 **客户端**。

© 2024 RabbitMQ. All rights reserved.