我正在尝试使用 Azure AD 作为 RabbitMQ 身份验证的 OAuth 服务器。为此,我想使用 Azure ADB2C 令牌。 我启用了 RabbitMq 的 oauth2 插件。我想使用签名密钥作为公钥设置。
在回答这个问题之前,我几乎没有关于设置的细节......
1. I have Azure ADB2C setup to authenticate my users to our REST API in application. This works fine.
2. I tried to authenticate RabbitMQ with open source OAuth 2 server like UAA, this works fine too.
想法是使用 Azure ADB2C 生成的 JWT 令牌来对用户进行身份验证和授权到 RabbitMQ。服务器。 我有来自 Azure ADB2C 用户流生成的元数据文档 JWKS URI 的私钥。所以我使用这个 JWKS URI - JWT 令牌来生成公钥。 我已将上述生成的公钥提供给 RabbitMQ 配置,如下
{rabbitmq_auth_backend_oauth2, [
{resource_server_id, <<"rabbitmq">>},
{key_config, [
{default_key, <<"key-1">>},
{signing_keys,
#{<<"key-1">> => {pem, <<"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVKUtcx/n9rt5afY/2WF
NvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmLiWZizpb+h0qup5j
znOvOr+Dhw9908584BSgC83YacjWNqEK3urxhyE2jWjwRm2N95WGgb5mzE5XmZIv
kvyXnn7X8dvgFPF5QwIngGsDG8LyHuJWlaDhr/EPLMW4wHvH0zZCuRMARIJmmqiM
y3VD4ftq4nS5s8vJL0pVSrkuNojtokp84AtkADCDU/BUhrc2sIgfnvZ03koCQRoZ
mWiHu86SuJZYkDFstVTVSR0hiXudFlfQ2rOhPlpObmku68lXw+7V+P7jwrQRFfQV
XwIDAQAB
-----END PUBLIC KEY-----">>}
}
}]}]}
我在 Azure ADB2C 中创建了一个 AD 用户并将其分配给通过 Azure 注册的 RabbitMQ 应用程序。我已经为使用rabbitMQ 权限注册的RabbitMQ 应用程序提供了默认范围,例如rabbitmq.read...等,并且我已经为已注册的应用程序提供了默认API 权限。 现在在我的 Java 应用程序中,我尝试使用以下代码连接到 RabbitMQ
CredentialsProvider credentialsProvider =
new OAuth2ClientCredentialsGrantCredentialsProviderBuilder()
.tokenEndpointUri("http://****/B2C_1_RabbitMQ/oauth2/v2.0/token")
.clientId("rabbit_client_from_Azure").clientSecret("rabbit_secret_from_Azure")
.grantType("password")
.parameter("username", "rabbit_admin_from_Azure")
.parameter("password", "rabbit_admin_from_Azure")
.build();
connectionFactory.setCredentialsProvider(credentialsProvider);
Connection connection = connectionFactory.newConnection(); // Line 1
当我运行上面的代码时,第 1 行它给了我如下错误
Exception in thread "main" com.rabbitmq.client.impl.OAuthTokenManagementException: HTTP request for token retrieval did not return 200 response code: 400
我不确定为什么会出现上述错误。我最初认为这将是 Azure ADB2C 注册的 RabbitMQ 应用程序的范围/权限问题,但我无法弄清楚我在这里遗漏了什么。 非常感谢这里的任何帮助。