Use auth0.com as OAuth 2.0 server
This guide explains how to set up OAuth 2.0 for RabbitMQ and Auth0 as Authorization Server using the following flows:
- Access management UI via a browser
- Access management HTTP API
- Application authentication and authorization
Prerequisites to follow this guide
- Have an Auth0 account
- Docker
- A local clone of a GitHub repository for branch
nextthat contains all the configuration files and scripts used on this example.
Create RabbitMQ API
In Auth0, resources are mapped to Application APIs.
- After logging into the Auth0 account, go to dashboard > Applications > APIs > Create an API.
- Give it the name
rabbitmq. The important thing here is theidentifierwhich must have the name of the resource_server_id we configured in RabbitMQ. Thisidentifiergoes into theaudienceJWT field. In our case, it is calledrabbitmq. - Choose
RS256as the signing algorithm. - Enable RBAC.
- Enable Add Permissions in the Access Token.
Configure permissions in RabbitMQ API
-
Edit the API we just created with the name
rabbitmq. -
Go into Permissions and add the permissions (scope) this api can grant. You are going to add the following scopes:
rabbitmq.read:*/*rabbitmq.write:*/*rabbitmq.configure:*/*rabbitmq.tag:administrator
Create an OAuth client for the Management UI
By default, for every API we create, an Application gets created using the API's identifier as its name.
An Application requests an OAuth client.
Go to dashboard > Applications, and you should see your application listed. An application gives us a client_id, a client_secret and a http endpoint called Domain where to claim a token.
Create Application rabbitmq-management
An application gives us the client-id and client-secret for the management UI to authenticate on behalf of the end user.
In the settings, choose:
- Application type :
Single Page applications - Allowed Callback URLs:
https://localhost:15671/js/oidc-oauth/login-callback.html - Allowed Web Origins:
https://localhost:15671 - Allowed Origins (CORS):
https://localhost:15671
Create a User for Management UI Access
Create user
- Go to User Management > Users.
- Create a user. This is the user you will use to login via the management UI.
Create permissions and grant them
- Go to Roles.
- Create the role called
rabbitmq.tag:administrator. - Go to Permissions and select all the permissions.
- Go to Users and make sure our user is listed else add our user to the list of users which have this role.
Configure RabbitMQ to authenticate with Auth0
To configure RabbitMQ you need to gather the following information from Auth0:
- Go to dashboard > Applications > Applications.
- Click on the application
rabbitmq-management. - Take note of the Client ID value
- And take note of the Domain value
- Use the last values in Client ID and Domain fields in the RabbitMQ configuration file
Copy conf/auth0/rabbitmq.conf.tmpl as rabbitmq.conf.
It must be in same folder as rabbitmq.conf.tmpl.
Edit rabbitmq.conf and proceed as follows:
- Replace
{Client ID}with the values you gathered above. - Same for
{Domain}
Starting with RabbitMQ 4.1.x, you must configure RabbitMQ to include a URI parameter
called audience whose value matches the value of auth_oauth2.resource_server_id.
Earlier RabbitMQ versions always sent this URI parameter. If this additional URI parameter is not configured, Auth0 will consider the token invalid and RabbitMQ will display "No authorized" for error.
These two configuration lines
configure the audience parameter with the value rabbitmq.
Start RabbitMQ
Run the following commands to start RabbitMQ:
export MODE=auth0
make start-rabbitmq
Verify Management UI flows
- Go to management UI
https://localhost:15671. - Click on the single button, authenticate with your secondary Auth0 user. You should be redirected back to the management UI.
Auth0 issues an access token like this one below. It has in the scope claim
the requested scopes configured in management.oauth_scopes, and in the permissions claim all the scopes you configured for this user in Auth0. RabbitMQ read the scopes from the scope claim but also from the claim name configured in auth_oauth2.additional_scopes_key whose value is 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:*/*"
]
}