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