使用 auth0.com 作为 OAuth 2.0 服务器
本指南介绍如何为 RabbitMQ 设置 OAuth 2.0,并使用 Auth0 作为授权服务器,采用以下流程
- 通过浏览器访问 管理 UI
- 访问管理 HTTP API
- 应用程序身份验证和授权
遵循本指南的先决条件
创建 RabbitMQ API
在 Auth0 中,资源映射到应用程序 API。
- 登录 Auth0 帐户后,转到 仪表板 > 应用程序 > API > 创建 API。
- 将其命名为
rabbitmq
。这里重要的是identifier
,它必须具有我们在 RabbitMQ 中配置的 resource_server_id 的名称。此identifier
进入audience
JWT 字段。在我们的例子中,它被称为rabbitmq
。 - 选择
RS256
作为签名算法。 - 启用 RBAC。
- 启用 在访问令牌中添加权限。
在 RabbitMQ API 中配置权限
-
编辑我们刚刚创建的名为
rabbitmq
的 API。 -
进入权限并添加此 API 可以授予的权限(scope)。您将添加以下 scope
rabbitmq.read:*/*
rabbitmq.write:*/*
rabbitmq.configure:*/*
rabbitmq.tag:administrator
为管理 UI 创建 OAuth 客户端
默认情况下,对于我们创建的每个 API,都会使用 API 的 identifier
作为其名称创建一个应用程序。一个应用程序请求一个 OAuth 客户端。
转到 仪表板 > 应用程序,您应该看到您的应用程序已列出。一个应用程序为我们提供一个 client_id,一个 client_secret 和一个名为 Domain 的 http 端点,用于声明令牌。
创建应用程序 rabbitmq-management
应用程序为我们提供了 client-id 和 client-secret,供管理 UI 代表最终用户进行身份验证。
在设置中,选择
- 应用程序类型:
Single Page applications
- 允许的回调 URL:
https://localhost:15671/js/oidc-oauth/login-callback.html
- 允许的 Web Origin:
https://localhost:15671
- 允许的 Origin (CORS):
https://localhost:15671
为管理 UI 访问创建用户
创建用户
- 转到 用户管理 > 用户。
- 创建一个用户。这将是您用于通过管理 UI 登录的用户。
创建权限并授予它们
- 转到 角色。
- 创建名为
rabbitmq.tag:administrator
的角色。 - 转到 权限 并选择所有权限。
- 转到 用户 并确保我们的用户已列出,否则将我们的用户添加到具有此角色的用户列表中。
配置 RabbitMQ 以使用 Auth0 进行身份验证
要配置 RabbitMQ,您需要从 Auth0 收集以下信息
- 转到 仪表板 > 应用程序 > 应用程序。
- 单击应用程序
rabbitmq-management
。 - 记下 客户端 ID 值
- 并记下 域 值
- 在 RabbitMQ 配置文件中使用 客户端 ID 和 域 字段中的最后的值
克隆配置文件 conf/auth0/rabbitmq.conf.tmpl 为 rabbitmq.conf
(与 rabbitmq.conf.tmpl
在同一文件夹中)。
编辑 rabbitmq.conf
并按如下步骤操作
- 将
{Client ID}
替换为您上面收集的值。 {Domain}
也是如此
从 RabbitMQ 4.1.x 开始,您必须配置 RabbitMQ 以包含一个名为 audience
的 URI 参数,其值与 auth_oauth2.resource_server_id
的值匹配。
早期的 RabbitMQ 版本始终发送此 URI 参数。如果未配置此额外的 URI 参数,Auth0 将认为令牌无效,RabbitMQ 将显示“No authorized”错误。
这两行配置 使用值 rabbitmq
配置 audience
参数。
启动 RabbitMQ
运行以下命令以启动 RabbitMQ
export MODE=auth0
make start-rabbitmq
验证管理 UI 流程
- 转到管理 UI
https://localhost:15671
。 - 单击单个按钮,使用您的辅助 Auth0 用户进行身份验证。您应该被重定向回管理 UI。
Auth0 发放如下所示的访问令牌。它在 scope
声明中具有在 management.oauth_scopes
中配置的请求 scope,并在 permissions
声明中具有您在 Auth0 中为此用户配置的所有 scope。RabbitMQ 从 scope
声明以及在 auth_oauth2.additional_scopes_key
中配置的声明名称(其值为 permissions
)读取 scope。
{
"iss": "https://dev-tm5ebsbbdcbqddcj.us.auth0.com/",
"sub": "auth0|66d980b862efcd9f5144f42a",
"aud": [
"rabbitmq",
"https://dev-tm5ebsbbdcbqddcj.us.auth0.com/userinfo"
],
"iat": 1725533554,
"exp": 1725619954,
"scope": "openid profile rabbitmq.tag:administrator",
"azp": "IC1fqsSjkQq2cVsYyHUuQyq30OAYuUv2",
"permissions": [
"rabbitmq.configure:*/*",
"rabbitmq.read:*/*",
"rabbitmq.tag:administrator",
"rabbitmq.write:*/*"
]
}