对适用于 RabbitMQ 的亚马逊 MQ 使用 OAuth 2.0 身份验证和授权 - Amazon MQ

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对适用于 RabbitMQ 的亚马逊 MQ 使用 OAuth 2.0 身份验证和授权

本教程介绍如何使用亚马逊 Cognito 作为 OAuth 2.0 提供商,为 RabbitMQ 经纪商配置 2.0 身份验证。 OAuth

注意

Amazon Cognito 在中国(北京)和中国(宁夏)不可用。

重要

本教程专门针对 Amazon Cognito,但您可以使用其他身份提供商 () IdPs。有关更多信息,请参阅 OAuth 2.0 身份验证示例

配置 OAuth 2.0 身份验证的先决条件

您可以通过部署堆栈(适用 OAuth 于 RabbitMQ 2 插件的 Amazon Cognito AWS CDK 堆栈)来设置本教程中所需的 Amazon Cognito 资源。如果您要手动设置 Amazon Cognito,请确保满足以下先决条件,然后再在亚马逊 MQ 上为 RabbitMQ 代理配置 OAuth 2.0:

设置 Amazon Cognito 的先决条件
  • 通过创建用户池来设置 Amazon Cognito 终端节点。为此,请查看标题为 “如何在 Amazon Cognito 中使用 OAuth 2.0:了解不同的 OAuth 2.0 赠款” 的博客。

  • 在用户池rabbitmq中创建名为的资源服务器,定义了以下范围:read:allwrite:allconfigure:all、和tag:administrator。这些作用域将与 RabbitMQ 权限相关联。

    有关创建资源服务器的信息,请参阅 Amazon Cognito 开发者指南中的为用户池定义资源服务器 (AWS Management Console)

  • 创建以下应用程序客户端:

    • 用户池类型的应用程序客户端Machine-to-Machine application。这是一个机密客户端,其客户端密钥将用于 RabbitMQ AMQP 客户端。有关应用程序客户端和创建应用程序客户端的更多信息,请参阅应用程序客户端类型创建应用程序客户端

    • 用户池类型的应用程序客户端Single-page application。这是一个公共客户端,将用于让用户登录到 RabbitMQ 管理控制台。您必须更新此应用程序客户端,以包含您将在以下过程中创建的 Amazon MQ for RabbitMQ 代理的终端节点作为允许的回调 URL。有关更多信息,请参阅使用 Amazon Cognito 控制台设置托管登录

设置 Amazon MQ 的先决条件
  • 正在运行的 Docker 安装,用于运行 bash 脚本,用于验证 OAuth 2.0 设置是否成功。

  • AWS CLI version >=2.28.23,使在创建代理时添加用户名和密码成为可选的。

使用 Amazon Cognito 配置 OAuth 2.0 身份验证 AWS CLI

以下过程说明如何使用亚马逊 Cognito 作为 IdP,为 RabbitMQ 经纪商设置 OAuth 2.0 身份验证。此过程 AWS CLI 用于创建和配置必要的资源。

在以下过程中,请确保将占位符值(例如 ConfigurationID 和 Revision 和)替换为它们的实际值。<c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca> <2>

  1. 使用 create-configuration AWS CLI 命令创建新配置,如以下示例所示。

    aws mq create-configuration \ --name "rabbitmq-oauth2-config" \ --engine-type "RABBITMQ" \ --engine-version "3.13"

    此命令返回的响应与以下示例类似。

    { "Arn": "arn:aws:mq:us-west-2:123456789012:configuration:c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca", "AuthenticationStrategy": "simple", "Created": "2025-07-17T16:03:01.759943+00:00", "Id": "c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca", "LatestRevision": { "Created": "2025-07-17T16:03:01.759000+00:00", "Description": "Auto-generated default for rabbitmq-oauth2-config on RabbitMQ 3.13", "Revision": 1 }, "Name": "rabbitmq-oauth2-config" }
  2. 创建一个名为的配置文件rabbitmq.conf以使用 OAuth 2.0 作为身份验证和授权方法,如以下示例所示。

    auth_backends.1 = oauth2 # FIXME: Update this value with the token signing key URL of your Amazon Cognito user pool. # If you used the AWS CDK stack to deploy Amazon Cognito, this is one of the stack outputs. auth_oauth2.jwks_url = ${RabbitMqOAuth2TestStack.JwksUri} auth_oauth2.resource_server_id = rabbitmq # Amazon Cognito does not include an audience field in access tokens auth_oauth2.verify_aud = false # Amazon Cognito does not allow * in its custom scopes. Use aliases to translate between Amazon Cognito and RabbitMQ. auth_oauth2.scope_prefix = rabbitmq/ auth_oauth2.scope_aliases.1.alias = rabbitmq/read:all auth_oauth2.scope_aliases.1.scope = rabbitmq/read:*/* auth_oauth2.scope_aliases.2.alias = rabbitmq/write:all auth_oauth2.scope_aliases.2.scope = rabbitmq/write:*/* auth_oauth2.scope_aliases.3.alias = rabbitmq/configure:all auth_oauth2.scope_aliases.3.scope = rabbitmq/configure:*/* # Allow OAuth 2.0 login for RabbitMQ management console management.oauth_enabled = true # FIXME: Update this value with the client ID of your public application client management.oauth_client_id = ${RabbitMqOAuth2TestStack.ManagementConsoleAppClientId} # FIXME: Update this value with the base JWKS URI (without /.well-known/jwks.json) auth_oauth2.issuer = ${RabbitMqOAuth2TestStack.Issuer} management.oauth_scopes = rabbitmq/tag:administrator

    此配置使用作用域别名将 Amazon Cognito 中定义的范围映射到兼容 RabbitMQ 的作用域。

  3. 使用 update-configuration AWS CLI 命令更新配置,如以下示例所示。在此命令中,添加您在本过程步骤 1 的响应中收到的配置 ID。例如 c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca

    aws mq update-configuration \ --configuration-id "<c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca>" \ --data "$(cat rabbitmq.conf | base64 --wrap=0)"

    此命令返回的响应与以下示例类似。

    { "Arn": "arn:aws:mq:us-west-2:123456789012:configuration:c-b600ac8e-8183-4f74-a713-983e59f30e3d", "Created": "2025-07-17T16:57:04.520931+00:00", "Id": "c-b600ac8e-8183-4f74-a713-983e59f30e3d", "LatestRevision": { "Created": "2025-07-17T16:57:39.172000+00:00", "Revision": 2 }, "Name": "rabbitmq-oauth2-config", "Warnings": [] }
  4. 使用您在本过程的步骤 2 中创建的 OAuth 2.0 配置创建代理。为此,请使用 create-broker AWS CLI 命令,如以下示例所示。在此命令中,分别提供您在步骤 1 和步骤 2 的响应中获得的配置 ID 和修订号。例如,c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca2

    aws mq create-broker \ --broker-name "rabbitmq-oauth2-broker" \ --engine-type "RABBITMQ" \ --engine-version "3.13" \ --host-instance-type "mq.m7g.large" \ --deployment-mode "CLUSTER_MULTI_AZ" \ --logs '{"General": true}' \ --publicly-accessible \ --configuration '{"Id": "<c-fa3390a5-7e01-4559-ae0c-eb15b38b22ca>","Revision": <2>}' \

    此命令返回的响应与以下示例类似。

    { "BrokerArn": "arn:aws:mq:us-west-2:123456789012:broker:rabbitmq-oauth2-broker:b-2a1b5133-a10c-49d2-879b-8c176c34cf73", "BrokerId": "b-2a1b5133-a10c-49d2-879b-8c176c34cf73" }
  5. 使用 desc ribe-broker AWS CLI 命令验证代理的状态是否从CREATION_IN_PROGRESS转换为,如以下示例所示。RUNNING在此命令中,提供您在上一步的结果中获得的经纪人 ID。例如,b-2a1b5133-a10c-49d2-879b-8c176c34cf73

    aws mq describe-broker \ --broker-id "<b-2a1b5133-a10c-49d2-879b-8c176c34cf73>"

    此命令返回的响应与以下示例类似。以下响应是该describe-broker命令返回的完整输出的缩写版本。此响应显示代理状态和用于保护代理的身份验证策略。在这种情况下,config_managed身份验证策略表明代理使用 OAuth 2 种身份验证方法。

    { "AuthenticationStrategy": "config_managed", ..., "BrokerState": "RUNNING", ... }

    要使用登录 RabbitMQ 管理控制台 OAuth2,需要将代理端点作为有效的回调 URL 添加到相应的 Amazon Cognito 应用程序客户端中。有关更多信息,请参阅 Amazon Cognito CDK 示例堆栈设置中的步骤 5。

  6. 使用以下perf-test.sh脚本验证 OAuth 2.0 身份验证和授权。

    使用此 bash 脚本来测试与 Amazon MQ for RabbitMQ 代理的连接。此脚本从 Amazon Cognito 获取令牌并验证连接配置是否正确。如果配置成功,您将看到您的代理发布和使用消息。

    如果您收到ACCESS_REFUSED错误,则可以使用代理 CloudWatch 日志对配置设置进行故障排除。您可以在 Amazon MQ 控制台中找到您的代理的 CloudWatch 日志组链接。

    在此脚本中,您需要提供以下值:

    • CLIENT_IDCLIENT_SECRET:您可以在 Amazon Cognito 控制台的应用程序客户端页面上找到这些值。

    • Cognito 域名:你可以在亚马逊 Cognito 控制台上找到这个域名。在 “品牌” 下,选择 “域名”。在页面上,您可以在资源服务器部分下找到此值。

    • 亚马逊 MQ 代理终端节点:您可以在亚马逊 MQ 控制台代理详情页面的 “连接” 下找到此值。

    #! /bin/bash set -e # Client information ## FIXME: Update this value with the client ID and secret of your confidential application client CLIENT_ID=${RabbitMqOAuth2TestStack.AmqpAppClientId} CLIENT_SECRET=${RabbitMqOAuth2TestStack.AmqpAppClientSecret} # FIXME: Update this value with the domain of your Amazon Cognito user pool RESPONSE=$(curl -X POST ${RabbitMqOAuth2TestStack.TokenEndpoint} \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&scope=rabbitmq/configure:all rabbitmq/read:all rabbitmq/tag:administrator rabbitmq/write:all") # Extract the access_token from the response. # This token will be passed in the password field when connecting to the broker. # Note that the username is left blank, the field is ignored by the plugin. BROKER_PASSWORD=$(echo ${RESPONSE} | jq -r '.access_token') # FIXME: Update this value with the endpoint of your broker. For example, b-89424106-7e0e-4abe-8e98-8de0dada7630.mq.us-east-1.on.aws. BROKER_DNS=<broker_dns> CONNECTION_STRING=amqps://:${BROKER_PASSWORD}@${BROKER_DNS}:5671 # Produce/consume messages using the above connection string QUEUES_COUNT=1 PRODUCERS_COUNT=1 CONSUMERS_COUNT=1 PRODUCER_RATE=1 docker run -it --rm --ulimit nofile=40960:40960 pivotalrabbitmq/perf-test:latest \ --queue-pattern 'test-queue-%d' --queue-pattern-from 1 --queue-pattern-to $QUEUES_COUNT \ --producers $PRODUCERS_COUNT --consumers $CONSUMERS_COUNT \ --id "test${QUEUES_COUNT}q${PRODUCERS_COUNT}p${CONSUMERS_COUNT}c${PRODUCER_RATE}r" \ --uri ${CONNECTION_STRING} \ --flag persistent --rate $PRODUCER_RATE

使用 Amazon Cognito 配置 OAuth 2.0 和简单身份验证

创建采用 OAuth 2.0 身份验证的代理时,可以指定以下身份验证方法之一:

  • OAuth 仅限 2.0:要使用此方法,请在创建代理时不要提供用户名和密码。前面的过程显示了如何仅使用 OAuth 2.0 身份验证方法。

  • OAuth 2.0 和简单身份验证:要使用此方法,请在创建代理时提供用户名和密码。此外,请auth_backends.2 = internal添加到您的经纪人配置中,如以下过程所示。

在以下过程中,请确保将占位符值(例如<ConfigurationId><Revision>)替换为其实际值。

  1. 要使用这两种身份验证方法,请创建您的代理配置,如以下示例所示。

    auth_backends.1 = oauth2 auth_backends.2 = internal # FIXME: Update this value with the token signing key URL of your Amazon Cognito user pool auth_oauth2.jwks_url = ${RabbitMqOAuth2TestStack.JwksUri} auth_oauth2.resource_server_id = rabbitmq auth_oauth2.verify_aud = false auth_oauth2.scope_prefix = rabbitmq/ auth_oauth2.scope_aliases.1.alias = rabbitmq/read:all auth_oauth2.scope_aliases.1.scope = rabbitmq/read:*/* auth_oauth2.scope_aliases.2.alias = rabbitmq/write:all auth_oauth2.scope_aliases.2.scope = rabbitmq/write:*/* auth_oauth2.scope_aliases.3.alias = rabbitmq/configure:all auth_oauth2.scope_aliases.3.scope = rabbitmq/configure:*/*

    此配置使用作用域别名将 Amazon Cognito 中定义的范围映射到兼容 RabbitMQ 的作用域。

  2. 创建一个同时使用两种身份验证方法的代理,如以下示例所示。

    aws mq create-broker \ --broker-name "rabbitmq-oauth2-broker-with-internal-user" \ --engine-type "RABBITMQ" \ --engine-version "3.13" \ --host-instance-type "mq.m7g.large" \ --deployment-mode "CLUSTER_MULTI_AZ" \ --logs '{"General": true}' \ --publicly-accessible \ --configuration '{"Id": "<ConfigurationId>","Revision": <Revision>}' \ --users '[{"Username":"<myUser>","Password":"<myPassword11>"}]'
  3. 验证代理状态以及设置身份验证方法的配置是否成功,如使用 Amazon Cognito 配置 OAuth 2.0 身份验证过程的步骤 5 和步骤 6 所述。