OIDC authentication with Auth0
OpenID Connect (OIDC) is an internet-scale federated identity and authentication protocol built on top of the OAuth 2.0 authorization framework and the JSON Object Signing and Encryption (JOSE) cryptographic system. OIDC builds on top of the OAuth 2.0 authorization protocol to enable a user to authorize a third-party application to access the user’s identity and authentication information.
The OIDC authentication method allows Boundary users to delegate authentication to an OIDC provider. This feature allows Boundary to integrate with popular identity providers like Auth0, cloud-hosted active directory services with an OIDC frontend, and cloud identity management systems such as AWS IAM.
Boundary users can create, read, update, and delete new OIDC authentication methods using the Admin Console UI, Boundary CLI, or the Boundary Terraform provider to enable login. OIDC auth methods can also be utilized for logging into the Admin Console and Desktop applications.
This tutorial provides an example of setting up OIDC with the Auth0 provider and managing OIDC authentication methods.
OIDC authentication methods overview
- Authentication workflow
- Auth0 configuration
- Auth method creation
- Authentication states
- OIDC authentication
Prerequisites
A Boundary binary greater than 0.8.0 in your
PATH
This tutorial assumes you can connect to an HCP Boundary cluster or launch Boundary in dev mode.
An Auth0 test account. The associated email address should not be tied to another SSO method, so use of a personal account is recommended.
Installing the Boundary Desktop App provides an optional workflow for this tutorial. The 1.2.0 version or above is required for OIDC support.
Installing Terraform 0.13.0 or greater provides an optional workflow for this tutorial. The binary must be available in your
PATH
.
Get setup
In this tutorial, you will test OIDC integrations using HCP Boundary or by running a Boundary controller locally using dev mode.
Start Boundary in dev mode:
$ boundary dev==> Boundary server configuration: [Controller] AEAD Key Bytes: hdcjQ5gegRbttzQ66D5GJjcxB+xtdHzL [Recovery] AEAD Key Bytes: E1/gdhTuDyhsvIm+tkQR0i4m/uSRrd5A [Worker-Auth] AEAD Key Bytes: gwo86AYxBlbPCLsw9lsBzZ4Fd7adcydw [Recovery] AEAD Type: aes-gcm [Root] AEAD Type: aes-gcm [Worker-Auth-Storage] AEAD Type: aes-gcm [Worker-Auth] AEAD Type: aes-gcm Cgo: disabled Controller Public Cluster Addr: 127.0.0.1:9201 Dev Database Container: hardcore_keller Dev Database Url: postgres://postgres:password@localhost:55000/boundary?sslmode=disable Generated Admin Login Name: admin Generated Admin Password: password Generated Host Catalog Id: hcst_1234567890 Generated Host Id: hst_1234567890 Generated Host Set Id: hsst_1234567890 Generated Oidc Auth Method Id: amoidc_1234567890 Generated Org Scope Id: o_1234567890 Generated Password Auth Method Id: ampw_1234567890 Generated Project Scope Id: p_1234567890 Generated Target Id: ttcp_1234567890 Generated Unprivileged Login Name: user Generated Unprivileged Password: password Listener 1: tcp (addr: "127.0.0.1:9200", cors_allowed_headers: "[]", cors_allowed_origins: "[*]", cors_enabled: "true", max_request_duration: "1m30s", purpose: "api") Listener 2: tcp (addr: "127.0.0.1:9201", max_request_duration: "1m30s", purpose: "cluster") Listener 3: tcp (addr: "127.0.0.1:9203", max_request_duration: "1m30s", purpose: "ops") Listener 4: tcp (addr: "127.0.0.1:9202", max_request_duration: "1m30s", purpose: "proxy") Log Level: info Mlock: supported: false, enabled: false Version: Boundary v0.10.3 Version Sha: d9eba38993eb70820a396894f2f1e28601d13c3d Worker Auth Current Key Id: folic-obliged-dude-stroller-skinless-eloquence-legible-dispense Worker Auth Registration Request: GzusqckarbczHoLGQ4UA25uSRm41paoR5HikgcBsCT4PMDFT7StpsFy5xjiWJwxszReKwcfGniKLcdpQto5HjhH3PqmdLU8fdT9kM7RMLiyzLKWdLqVWBhhdUiEy7Re2ConJcGWdHsGK7Th6zVQ3SXjqND3dQ3ytcVtAhdEznJQ58ib6HoMvpMTs66TS5ULCBXxpQ1u2syC6ChNPEPbaSpQd9pKWjPcPRVDjKpMzp6cjw9LZSPxBdadM81f7yS3voWoM5yMciXdUW6rqSMaP1NxRvQUAdhVQsM1ZqGLHNV Worker Auth Storage Path: /var/folders/8g/4dnhwwzx2d771tkklxwrd0380000gp/T/nodeenrollment1533264699 Worker Public Proxy Addr: 127.0.0.1:9202 ==> Boundary server started! Log data will stream in below: { "id": "GypYTtKfJI", "source": "https://hashicorp.com/boundary/localmachine/controller+worker", "specversion": "1.0", "type": "system", "data": { "version": "v0.1", "op": "github.com/hashicorp/boundary/internal/observability/event.(*HclogLoggerAdapter).writeEvent", "data": { "@original-log-level": "none", "@original-log-name": "aws", "msg": "configuring client automatic mTLS" } }, "datacontentype": "text/plain", "time": "2022-09-06T14:14:37.939433-06:00"}...... More log output ......
Leave dev mode running in the current session, and open a new terminal window or tab.
Authenticate to the local Boundary dev server. Enter the password password
when prompted.
$ boundary authenticate password -auth-method-id ampw_1234567890 -login-name adminPlease enter the password (it will be hidden): <password> Authentication information: Account ID: acctpw_1234567890 Auth Method ID: ampw_1234567890 Expiration Time: Wed, 14 Jul 2021 11:38:18 MDT User ID: u_1234567890 The token was successfully stored in the chosen keyring and is not displayed here.
Providers
To enable an OIDC auth method an administrator must first configure their OIDC provider, and then Boundary. The administrator registers Boundary as a new client with their OIDC provider by providing some values unique to their Boundary deployment. The administrator then configures Boundary with unique client information provided by their OIDC provider during registration. These values must match up for OIDC to work.
The administrator will need to provide a list of Boundary callback URLs when configuring the OIDC provider. The callback URLs route to one of the controllers and must begin with 'https', unless Boundary is in dev mode, where the URLs will route to localhost.
Many OIDC providers can be integrated with Boundary. This tutorial demonstrates working with Auth0, a popular provider for OIDC.
Get setup with Auth0
A developer account and sample application are required to setup Auth0 as an OIDC provider for Boundary. If you don't have a developer account, sign up for Auth0. It is recommended to use a personal account for testing, and to avoid integrating an account that might already be associated with Auth0. A free account is suitable for testing OIDC integration with Boundary.
Create a user
First, create an Auth0 user that will be permitted to log into the application that authorizes Boundary.
Once signed up, the Auth0 Dashboard is displayed. Navigate to the User Management view using the sidebar on the left side of the page.
Click + Create User.
Enter the user Email and Password, then Click Create.
The new user's details should be displayed in the User Management Dashboard.
If using Terraform to provision Boundary, copy the user_id value under the Identity Provider Attributes section. Save this value for defining the
oidc_user
subject
later on.
Create an application
An application is what authorizes Auth0 users added in the previous step to connect with Boundary. After creating an application, its configuration details are used to add the OIDC auth method to Boundary.
Navigate to the Applications view using the sidebar on the left side of the page.
From the Applications view, click the + Create Application button.
Select Regular Web Application and give your application a name. This tutorial calls the application Boundary OIDC Test. Click Create.
Once created the browser should redirect to the application settings view. If not, visit Applications using the navigation bar on the left, select the new application and visit its Settings view.
Scroll down to the Application URIs section.
Paste the following callback URL under the Allowed Callback URLs field.
http://localhost:9200/v1/auth-methods/oidc:authenticate:callback
This value is also printed later on when creating the OIDC method with the Boundary CLI, but is fixed and can be entered into the Auth0 provider settings ahead of time.
Lastly, locate the Allowed Logout URLs section directly below, and enter
http://localhost:3000
because Boundary is running in dev mode.Make sure your config matches the image shown below.
Three important values are listed at the top of the Settings view for use when configuring OIDC with Boundary.
- Domain
- Client ID
- Client Secret
Keep this page open to refer to these values in the next steps.
Auth method creation
Authentication is the process of establishing a user's identity. The user initiates this process by selecting an auth method.
When the user selects an OIDC auth method, the user's client sends a request to the system and includes additional data about the client itself. The system then returns two URLs: an OIDC authentication request URL and a Boundary token request URL.
If the user's client is a web browser, the client stores the Boundary token request URL in local storage then redirects the page to the OIDC authentication request URL. If the user's client is not a web browser, the client opens a web browser to the OIDC authentication request URL and begins polling the Boundary token request URL.
The user interacts with the OIDC provider to prove their identity using the browser window opened by the user's client. Once the OIDC provider has authenticated the user's identity, it redirects the browser window back to Boundary. The user's client then retrieves a Boundary token from the request URL.
To get started, an authentication method must be created for the provider of choice.
Create auth method for the provider
To set up a new auth method for your provider you will need the following from your provider's application settings:
- issuer
- client-id
- client-secret
Auth methods can be created using the Admin Console UI, CLI, or using Terraform.
The Boundary Admin Console provides a UI for creating and managing OIDC resources, including auth methods.
Open the Admin Console UI by entering the Dev Controller URL of
http://localhost:9200
into a browser.
Enter the admin username admin
and password password
and click
Authenticate.
For Auth0, these settings map to the following:
issuer
-> Domainclient-id
-> Client IDclient-secret
-> Client Secret
With these values you gathered from the Auth0 application settings above a new OIDC auth method can be created.
Start by navigating to the Auth Methods settings view using the menu on the left side of the Admin Console. Select New and click OIDC.
Fill out the form details using the settings gathered from the Auth0 application settings.
These include:
- Name (Example:
Auth0
) - Description (Example:
Auth0 OIDC test auth method
) - Issuer (Example:
https://dev-1vdl8c0q.us.auth0.com/
) Ensure the Issuer has a trailing/
at the end - Client ID (Example:
zbaJLTZh3n14WqSV7qQ9onuIVRDaZdzz
) - Client Secret (Example:
t35c9NNw1aZ8haQKYJjCL0lauNOSp5UNPovUJXo8Ea2sPZAR1DszEowX-5-lg-Xr
)
Additionally, set the Max Age and API URL Prefix as follows:
- Max Age:
0
- API URL Prefix:
http://localhost:9200
Max Age
The Max Age property defines the amount of time since the user's last authentication that must pass before the user must log in again. For this demonstration, it will prevent any existing Auth0 accounts currently authenticated in the browser from being used when the authentication is performed.
API URL Prefix
The API URL Prefix is set to http://localhost:9200
because Boundary is
running in dev mode. This URL is used for actions like token retrieval and
redirection.
Once the form is completed, click Save.
With the new auth method created, an allowed signing algorithm can be added.
Click Edit Form for the new auth method and scroll down to the Signing Algorithms section. Ensure that RS256 is selected and click Add.
Once added, Save the form.
The new authentication method has now been created. To the right of the new auth method, notice the state is set to Inactive. Before it can be used the new auth method must be switched to an active state.
Next we will review the available authentication states and activate the new OIDC auth method.
Troubleshooting
If unable to save the auth method, ensure that the Issuer has a trailing /
at the end of the URL.
Authentication states
An OIDC auth method can be in one of several different states: Inactive, Active Private, and Active Public. The current state of an OIDC auth method affects how endpoints respond to requests and, in some cases, whether access to an endpoint requires authentication.
State change operations
- MakeInactive transitions an OIDC auth method from either the Active Private or the Active Public state into the Inactive state.
- MakePrivate transitions an OIDC auth method from either the Inactive or the Active Public state into the Active Private state. If transitioning from the Inactive state, the transition will only succeed if the configuration is valid.
- MakePublic transitions an OIDC auth method from either the Inactive or the Active Private state into the Active Public state. If transitioning from the Inactive state, the transition will only succeed if the configuration is valid.
Three different states exist for an authentication method:
inactive
users can not authenticate with inactive auth methods and the inactive auth methods are not listed for unauthenticated users.active-private
users can authenticate with active-private auth methods and active-private auth methods are not listed for unauthenticated users.active-public
users can authenticate active-public auth methods and active-public auth methods are listed for unauthenticated users.
Before changing the state of an auth-method, Boundary will retrieve the Provider’s discovery document for the auth method’s issuer and attempt to validate the auth-method’s configuration against this published information. If Boundary is unable to validate the configuration an error is returned and the state change is not made.
If a change is made from active-public or active-private to inactive, all in-flight authentications will succeed unless the auth method’s configuration is modified while the request is in-flight.
When changing an auth method's state using boundary auth-methods change-state
the -disable-discovered-config-validation
flag is used to disable validation
against the provider’s published discovery document. This allows for the very
rare occurrence when the Provider has published an invalid discovery document.
Activate the OIDC auth method
Now that a new OIDC method has been created, it can be activated and assigned as the default login type for the global scope.
Currently the login type is set as inactive, and won't allow authentication.
$ boundary authenticate oidc -auth-method-id amoidc_oHt4HQFCrNError from controller when performing authentication start Error information: Kind: Internal Message: authmethod_service.(Service).authenticateOidcStart: Error generating parameters for starting the OIDC flow.: unknown: error #500 Status: 500 context: Error from controller when performing authentication start
Auth methods can be activated using the Admin Console UI, CLI, or using Terraform.
Before the new auth method will be allowed it must be set to an active state.
Under the settings for the new auth method, select Inactive from the menu in the upper-right side of the page and change its state by clicking Public.
The login type is now allowed.
Set OIDC as primary login
Global and organization scopes may have auth methods in Boundary, and each scope has one primary auth-method ID. Boundary will automatically create a user upon first successful authentication using the scope’s primary auth method, which will be used by scopes with only one auth method available.
When migrating the database, Boundary will produce a log of any auth methods which resulted in no primary auth method being set for the scope.
Set the new OIDC auth method as the primary auth method for the global scope.
Under the settings for the new auth method, select Manage from the menu in the upper-right side of the page.
A confirmation window will be displayed to inform you that new users that sign in using OIDC will automatically be added to the new auth method. Select OK to continue.
Now try authenticating using the newly created OIDC auth method.
Select the admin user menu in the top-right corner of the page and select Deauthenticate.
Next, select the new auth method called Auth0, and click Authenticate.
A browser tab should automatically open and prompt you to log in with your Auth0 user account credentials.
After successful authentication you are automatically redirected to the Admin Console. Notice the restricted permissions for this new user, which can be updated and assigned using Roles and Groups.
If you were to log back into the Admin Console as the admin user, you would notice the new OIDC user has automatically been added under the Users view.
Next you will review the various methods that can be used to authenticate to Boundary using the new OIDC auth method.
Authenticate using OIDC
With the OIDC provider configured, Boundary users can authenticate using the CLI, Admin Console or Boundary Desktop app. Boundary administrators will usually follow a CLI or Admin Console workflow, while clients and end-users can use the CLI or Desktop application.
The Boundary Desktop app is currently available for MacOS and Windows users.
Launch the Boundary Desktop app and enter the Boundary Cluster URL.
Launch the Boundary Desktop app and enter
http://localhost:9200
as the Cluster URL, then click Submit.Select Auth0 and click Authenticate.
A browser window should launch and prompt for your provider's user credentials. You may see an "Authentication Pending" message, and can click the "Retry" button to force a new authentication tab to open.
Submit your OIDC provider user credentials. Below is an example of authenticating using Auth0.
You should receive a "Successful Authentication" message.
Once authenticated, open the Boundary Desktop app again and verify the authenticated user in the upper-right corner of the application window.
It is expected for this user to be unprivileged, and to be denied access to view targets and sessions. The OIDC user could be updated to include new privileges if an admin user assigns it to a role.
You have now completed OIDC integration with the Boundary Desktop app.
Cleanup and teardown
Warning
If you plan on completing the Manage IdP Groups tutorial, leave the current configuration running. Successful completion of this tutorial is a pre-requisite for the Manage IdP Groups tutorial.
If you are not continuing on to the next tutorial, tear down the environment:
1. Stop Boundary dev mode
Locate the shell where boundary dev
was run and enter ctrl+c
to stop dev
mode.
^C==> Boundary dev environment shutdown triggered[INFO] worker: status ticking shutting down[INFO] controller: terminating completed sessions ticking shutting down[INFO] controller: closing expired pending tokens ticking shutting down[INFO] controller: status ticking shutting down[INFO] controller: recovery nonce ticking shutting down
2. Delete any sample applications from your OIDC provider.
This tutorial provided steps for configuring an Auth0 sample applications as Boundary auth methods. Revisit the provider settings and delete any sample applications you no longer need.
3. Delete any test users from your OIDC provider.
This tutorial created sample users within Auth0 to authenticate using the CLI, Admin Console or Desktop app. Revisit the Auth0 settings and remove any test users created for this tutorial.
4. Delete any test client secrets from your OIDC provider.
This tutorial may have created client secrets within Auth0. Revisit the provider settings and remove any client secrets created for this tutorial.
Next steps
This tutorial demonstrated the steps to add an OIDC authentication method and create a new user. You set up a provider application to authenticate with Boundary, and verified that you can authenticate using the newly created user.
Next, check out the Manage IdP Groups tutorial to learn about automatically managing group membership claims with OIDC auth methods.
To learn more about the basics of managing user accounts, check out the Manage Users and Groups and Manage Roles tutorials.