使用 Keycloak 作为 OAuth 2.0 服务器
本指南说明了如何使用以下流程为 RabbitMQ 和 Keycloak 作为授权服务器设置 OAuth 2.0
- 通过浏览器访问 管理 UI
- 访问管理 REST API
- 应用程序身份验证和授权
遵循本指南的先决条件
- Docker
- make
- 一个 GitHub 仓库 的本地克隆,其中包含本示例中使用的所有配置文件和脚本
部署 Keycloak
-
首先,部署 **Keycloak**。它预先配置了所有必需的范围、用户和客户端。
-
运行以下命令以启动 **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
- 转到 https://127.0.0.1:15672。
- 单击页面上的单个按钮,该按钮会重定向到 **Keycloak** 以进行身份验证。
- 输入 `rabbit_admin` 和 `rabbit_admin`,您应该会重定向回完全登录的 RabbitMQ 管理。
停止 Keycloak
make stop-keycloak
有关设置 Keycloak 的说明
配置客户端
对于使用 **客户端凭据流** 的后端应用程序,您可以创建一个具有以下属性的 **客户端**
- **访问类型**:`public`
- 关闭 `标准流`、`隐式流` 和 `直接访问授权`
- 启用 **服务帐户**。如果未启用,则没有 `凭据` 选项卡
- 在 `凭据` 选项卡中,您有 `client id`
配置客户端范围
默认客户端范围 是自动授予每个令牌的范围。而 可选客户端范围 仅在授权/令牌请求流中明确请求时才会授予。
包含适当的 aud 声明
您必须配置一个类型为 **硬编码声明** 的 **令牌映射器**,其值为 rabbitmq 的 *resource_server_id*。您可以将 **令牌映射器** 配置为 **客户端范围** 或 **客户端**。