将 auth0.com 用作 OAuth 2.0 服务器
本指南介绍如何使用以下流程将 RabbitMQ 设置为 OAuth 2.0,并将 Auth0 设置为授权服务器
- 通过浏览器访问 管理界面
- 访问管理 HTTP API
- 应用程序身份验证和授权
遵循本指南的先决条件
创建 RabbitMQ API
在 Auth0 中,资源映射到应用程序 API。
- 登录 Auth0 账户后,转到 仪表板 > 应用程序 > API > 创建 API。
- 给它命名为
rabbitmq。这里重要的是identifier,它必须与我们在 RabbitMQ 中配置的 resource_server_id 名称匹配。此identifier进入audienceJWT 字段。在我们的例子中,它称为rabbitmq。 - 选择
RS256作为签名算法。 - 启用 RBAC。
- 启用 在访问令牌中添加权限。
在 RabbitMQ API 中配置权限
-
编辑我们刚刚创建的名为
rabbitmq的 API。 -
进入权限并添加此 API 可以授予的权限(作用域)。您将添加以下作用域
rabbitmq.read:*/*rabbitmq.write:*/*rabbitmq.configure:*/*rabbitmq.tag:administrator
为管理 UI 创建 OAuth 客户端
默认情况下,对于我们创建的每个 API,都会创建一个使用 API 的 identifier 作为其名称的应用程序。应用程序 请求一个 OAuth 客户端。
转到 仪表板 > 应用程序,您应该会看到您的应用程序已列出。应用程序为我们提供了 client_id、client_secret 和一个名为 Domain 的 HTTP 端点,用于声明令牌。
创建应用程序 rabbitmq-management
应用程序为管理 UI 提供 client-id 和 client-secret,以便代表最终用户进行身份验证。
在设置中,选择
- 应用程序类型:
单页应用程序 - 允许的回调 URL:
https://:15671/js/oidc-oauth/login-callback.html - 允许的 Web 源:
https://:15671 - 允许的源 (CORS):
https://: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 将显示“无授权”错误。
这 两行配置 使用值 rabbitmq 配置 audience 参数。
启动 RabbitMQ
运行以下命令来启动 RabbitMQ
export MODE=auth0
make start-rabbitmq
验证管理 UI 流程
- 转到管理 UI
https://:15671。 - 单击单个按钮,使用您的辅助 Auth0 用户进行身份验证。您应该会被重定向回管理 UI。
Auth0 会发出类似下面的访问令牌。它在 scope 声明中包含在 management.oauth_scopes 中配置的作用域,并在 permissions 声明中包含您在此用户在 Auth0 中配置的所有作用域。RabbitMQ 从 scope 声明中读取作用域,也从 auth_oauth2.additional_scopes_key 中配置的声明名称读取作用域,其值为 permissions。
{
"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:*/*"
]
}