使用 Okta 作为 OAuth 2.0 服务器
演示如何使用 OAuth 2.0 协议和 Okta 作为授权服务器,通过以下流程进行身份验证
- 通过浏览器访问 管理 UI
遵循本指南的先决条件
在 Okta UI 中创建您的应用程序集成
当使用 Okta 作为 OAuth 2.0 服务器 时,您的客户端应用程序(在本例中为 RabbitMQ)需要一种方法来信任 Okta OIDC 登录小部件 向其颁发的安全令牌。
建立信任的第一步是在 Okta 的身份平台中创建您的应用程序。要了解有关 Okta 中应用程序注册的更多信息,请参阅 Okta 文档。
在 Okta 中登录您的账户后,请按照以下步骤操作
- 在管理控制台中,转到应用程序。
- 点击创建应用程序集成。
- 要创建 OIDC 应用程序集成,请选择 OIDC - OpenID Connect 作为登录方法。
- 选择要与 Okta 集成的应用程序类型。选择 单页应用程序 (SPA)。
- 点击下一步。
OIDC 的应用程序集成向导包含三个部分
在常规设置中,提供以下信息
- 名称:应用程序集成名称:为您的应用程序集成指定一个名称(例如:rabbitmq-oauth2)
- 授权类型:选择 授权码 和 刷新令牌
- 重定向 URI:
- 在 登录重定向 URI 中,输入 https://localhost:15671/js/oidc-oauth/login-callback.html
- 将 登出重定向 URI 配置为 https://localhost:15671
在受信任的来源(对于 Web 和原生应用程序集成),选择 保留默认值。
在分配中,选择 允许组织中的每个人访问。
停用 Federation Broker Mode
。我们的测试表明,如果 Federation Broker Mode
被激活(这是 Okta 推荐的做法),则无法将此应用程序分配给组和用户。
最后,准备复制并保存将在以下屏幕之一上显示的值,然后单击 保存。
单击 保存 后,记下以下值,稍后配置 RabbitMQ 时需要使用它们
- ClientID
创建 Okta OAuth 2.0 授权服务器、作用域和声明
授权服务器用于验证用户身份并颁发可用于访问受保护资源的访问令牌。在 Okta 中,授权服务器可用于定义作用域,作用域本质上是权限,用于确定用户可以访问哪些资源。通过定义作用域,您可以控制不同用户对您的资源的访问级别。
以下是使用 Okta 中的默认授权服务器为 admin
和 dev
组创建作用域的步骤
-
登录您的 Okta 帐户,然后在 Okta 控制台中的 安全 -> API 下导航到 授权服务器 选项卡。
-
单击提供的默认授权服务器。
记下与默认授权服务器关联的以下字段,因为稍后您将需要使用它们来配置 RabbitMQ。
- 颁发者.
- 元数据 URI.
-
单击 作用域 选项卡,然后单击 添加作用域 按钮。
-
输入
admin
作为作用域的名称,并根据需要输入描述。 -
重复步骤 4,为
dev
创建作用域。 -
保存您的更改。
以下是为 role 创建声明以区分 admin
和 dev
组的步骤,当使用 Okta 中的默认授权服务器进行身份验证时
-
登录您的 Okta 帐户,然后在 Okta 控制台中的 安全 -> API 下导航到 授权服务器 选项卡。
-
单击提供的默认授权服务器。
-
单击 声明 选项卡,然后单击 添加声明 按钮。
-
输入
role
作为声明的名称。 -
选择 访问令牌 作为包含在令牌类型中。
-
选择 表达式 作为值类型
-
在 值 字段中输入以下表达式:
isMemberOfGroupName("admin") ? "admin" : isMemberOfGroupName("monitoring") ? "monitoring" : ""
-
点击创建。
注意:上面的表达式返回一个名为 role
的声明,如果用户是 admin
组的成员,则值为 admin
,如果用户是 monitoring
组的成员,则值为 monitoring
创建组以允许访问管理 UI
-
登录您的 Okta 管理仪表板,并通过单击顶部菜单中的 组 选项卡导航到 组 页面。
-
单击页面右上角的 添加组 按钮。
-
在 添加组 对话框中,在 组名称 字段中输入组的名称。您还可以在 描述 字段中输入组的描述,尽管这是可选的。
-
如果您想立即向组添加成员,您可以通过单击对话框 成员 部分中的 添加人员 按钮来执行此操作。您可以按姓名或电子邮件地址搜索用户,并通过选择他们的姓名并单击 添加 按钮将他们添加到组中。
-
如果您想设置组规则,您可以通过单击对话框中的 规则 选项卡来执行此操作。组规则允许您根据条件(例如他们的电子邮件域、职位或部门)自动从组中添加或删除用户。
-
配置完组后,单击 创建组 按钮以创建组。
将应用程序和用户分配给组
下一步是将用户分配到 Okta 中的组,并授予他们访问与该组关联的应用程序的权限。对于我们的用例,我们希望将一些用户分配到 dev
和 admin
组,并将 rabbitmq-oauth2
应用程序分配给这两个组。
-
登录您的 Okta 管理仪表板,并通过单击顶部菜单中的 目录 选项卡,然后选择 人员 导航到 用户 页面。
-
找到您要分配到组的用户,然后单击他们的姓名以打开他们的用户配置文件。
-
在用户配置文件中,单击 组 选项卡以查看用户当前所属的组。
-
要将用户添加到组,请单击页面右上角的 添加组 按钮。从可用组列表中选择您要将用户添加到的组,然后单击 添加 按钮以将用户添加到组。
-
要授予用户访问与组关联的应用程序的权限,请导航到用户配置文件中的 应用程序 选项卡。找到您要授予访问权限的应用程序,然后单击应用程序名称以打开其设置。
-
在应用程序设置中,单击 分配 选项卡以查看当前分配给应用程序的用户和组。
-
要将用户添加到应用程序,请单击页面右上角的 分配 按钮。从可用组列表中选择您要将用户分配到的组,然后单击 分配 按钮以将用户分配给该组的应用程序。
-
重复步骤 4-7,将用户添加到任何其他组和应用程序。
将用户添加到相应的组和应用程序后,他们应该有权访问该应用程序以及与这些组关联的任何资源。
创建访问策略和规则
此步骤是必要的,否则令牌不会携带授予用户的任何作用域。
[可选] 测试 Okta 颁发的令牌
这完全是可选的,但它可以节省您的时间。
- 转到 默认授权服务器。
- 单击 令牌预览 选项卡。
- 填写所有字段。对于 授权类型,选择
授权码
。 - 单击 预览令牌 按钮。
- 检查声明
role
,看看它是否包含您分配给用户的角色。
配置 RabbitMQ 以使用 Okta 作为 OAuth 2.0 身份验证后端
Okta 端的配置现已完成。下一步是配置 RabbitMQ 以使用先前创建的资源。
以下值在后续步骤中是必要的
- okta_client_app_ID:上面注册的 Okta 应用程序,用于 RabbitMQ
- okta-Issuer:默认授权服务器
- okta-Metadata-URI:默认授权服务器
克隆 rabbitmq.conf.tmpl 为 rabbitmq.conf
(与 rabbitmq.conf.tmpl
在同一文件夹中)。还有第二个配置文件,advanced.config,您保持原样即可。这是 RabbitMQ 高级配置,它将 RabbitMQ 作用域映射到先前在 Okta 中配置的权限。
编辑 rabbitmq.conf
并按如下步骤操作
- 将
{okta_client_app_ID}
替换为您的 okta_client_app_ID - 将
{okta-issuer}
替换为您的 okta-Issuer - 确保 okta-Metadata-URI 与此值匹配
{okta-issuer}/.well-known/oauth-authorization-server
或{okta-issuer}/.well-known/openid-configuration
- 否则,您需要确定
{okta-issuer}
中 uri 之后的路径,并相应地更新auth_oauth2.discovery_endpoint_path
。例如,如果 okta-Metadata-URI 是{okta-issuer}/some-other-endpoint
,则使用值some-other-endpoint
更新auth_oauth2.discovery_endpoint_path
。
在 rabbitmq.conf
文件的底部配置了在 Okta 中配置的角色映射,例如 monitoring
和 admin
。例如
#...
auth_oauth2.scope_aliases.admin = okta.read:*/* okta.write:*/* okta.configure:*/* okta.tag:administrator
auth_oauth2.scope_aliases.monitoring = okta.tag:management okta.read:*/
#...
关于 OpenId 发现端点
RabbitMQ 使用标准的 OpenId 发现端点路径 .well-known/openid-configuration
。除了 .well-known/oauth-authorization-server
之外,Okta 也支持此路径。在编写本指南时观察到的唯一区别是后者在 json 属性 claims_supported
中返回更多值。
本示例中提供的 RabbitMQ 模板配置注释掉了此行,这意味着 RabbitMQ 将使用标准路径。如果您发现任何问题,请尝试取消注释此行。
#auth_oauth2.discovery_endpoint_path = .well-known/oauth-authorization-server
启动 RabbitMQ
运行以下命令以运行 RabbitMQ docker 镜像
export MODE=okta
make start-rabbitmq
验证 RabbitMQ 管理 UI 访问
转到 RabbitMQ 管理 UI https://localhost:15671
。根据您的浏览器,忽略安全警告(由使用 自签名证书 引起)以继续。
在 RabbitMQ 管理 UI 页面上,单击 点击此处登录 按钮,使用您的 okta 用户 进行身份验证。
登录成功后,您将被重定向回 RabbitMQ 管理 UI。