Blue currently uses strict directory provisioning rather than just-in-time (JIT) provisioning. Assigning a user only to an OIDC application permits authentication in Okta, but OIDC does not notify Blue about assignment, profile changes, group changes, or deactivation. SCIM creates the account before first login and remains the lifecycle source of truth.
Assign each managed user to both applications. The word “Test” is Okta’s name for its generic private SCIM connector; it is not a second user authentication mechanism.
Before you begin
You need:- An Okta administrator who can create an OIDC web application and a private SCIM integration
- Public HTTPS URLs for the dashboard and Control API in production
- Access to the Blue deployment configuration and secrets
- The bootstrap administrator credentials
The callback URL is
{BETTER_AUTH_URL}/api/auth/callback/{HARNESS_OIDC_PROVIDER_ID}. The provider ID is part of the URL, so changing it later also changes the callback URL registered in Okta.Test with local services
For local development, the browser can return directly to the loopback dashboard:8080 with an HTTPS tunnel such as ngrok, then use the tunnel URL only as Okta’s SCIM connector base URL:
Configure Okta and Blue
1
Generate the deployment secrets
Generate a dedicated, high-entropy SCIM bearer token. For a new deployment, also generate and persist a Better Auth secret. For example:Store the generated value in your deployment secret manager as
HARNESS_SCIM_BEARER_TOKEN. Do not reuse a user password, OIDC client secret, or API token.2
Create the Okta OIDC application
In the Okta Admin Console, create an OIDC - OpenID Connect app integration with Web Application as the application type.Configure the application with:
- Sign-in redirect URI: the callback URL from the table above
- Grant type: Authorization Code
- Assignments: the people or groups that are allowed to use Blue
3
Find the OIDC issuer
For basic workforce SSO, use Okta’s organization authorization server. Its issuer is the Okta domain without Blue uses OIDC discovery from this issuer. Confirm that
/oauth2/default:{issuer}/.well-known/openid-configuration is reachable from the dashboard service.If your organization requires the custom default authorization server, use https://example.okta.com/oauth2/default. You must also permit the OIDC client:- Go to Security → API → Authorization Servers → default → Access Policies.
- Add a policy assigned to the Blue OIDC client.
- Add a rule allowing Authorization Code, assigned users, and the
openid,profile, andemailscopes.
4
Configure Blue identity settings
Set these environment variables for the deployment:Keep the existing
BETTER_AUTH_URL, CONTROL_API_PUBLIC_URL, bootstrap credentials, database, and internal service settings. For Docker Compose, place the values in the environment or .env file read by Compose.HARNESS_SCIM_GROUP_ROLE_MAPPINGS must be a JSON object. Group names are exact and case-sensitive, and roles must be admin or member. A provisioned user defaults to member; an admin mapping takes precedence if multiple pushed groups match.5
Deploy OIDC mode and verify SCIM
Rebuild or restart the Control API and dashboard with the new settings. Verify the Control API and authenticated SCIM discovery endpoint:The second request should return a SCIM
ServiceProviderConfig document. A 401 Unauthorized response normally means the bearer token does not match the deployment secret.6
Create the Okta SCIM integration
Create Okta’s generic private SCIM connector:
- Go to Applications → Applications → Browse App Catalog.
- Search for SCIM 2.0 Test App (Header Auth) and select Add Integration.
- Give the application a recognizable label.
- Leave the initial sign-on options at their defaults and finish creating the application.
- Open Provisioning → Configure API Integration and enable the API integration.
- SCIM connector base URL: the SCIM base URL from the table above
- Unique identifier field for users:
userName - Authentication mode: HTTP Header
- API Token:
Bearerfollowed by theHARNESS_SCIM_BEARER_TOKENvalue
7
Enable provisioning actions and attributes
Enable these To App actions in Okta:
- Create Users
- Update User Attributes
- Deactivate Users
userName, active, name.givenName, and name.familyName. Blue treats userName as the user’s email address and also accepts the standard SCIM email attribute.8
Provision a test user
Assign one non-administrator test user to the SCIM application and confirm that Okta reports a successful push. Then assign the same user to the separate OIDC Web Application.Both assignments are required:
- The SCIM assignment creates the Blue account.
- The OIDC assignment permits the user to authenticate. Without it, Okta reports that the user is not assigned to the client application.
member role. In managed mode, the Identity & provisioning tab shows the status reported by GET /admin/identity/status.If an existing local user has the same normalized email, SCIM converts that account to an identity-provider-managed account. Governance history remains attached to the user, while the local password and issued credentials are revoked. The protected bootstrap administrator cannot be converted.9
Configure groups and administrator mapping
Create or select the Okta group whose members should administer Blue. Its name must match a key in
HARNESS_SCIM_GROUP_ROLE_MAPPINGS; for example, Blue Admins.To grant the configured example administrator role:- Go to Directory → Groups and create
Blue Admins. - Add the managed user to the group.
- Open the SCIM application and select Push Groups.
- Select Push Groups → Find groups by name.
- Select
Blue Adminsand push its memberships immediately.
admin role on Members.Users with no matching group remain member. Removing the final matching administrator group demotes the user to member; it does not deactivate the account.10
Test SSO and lifecycle changes
Sign out, enter the provisioned user’s email on the Blue login page, and confirm that the browser redirects to Okta. Complete authentication and verify that you return to the dashboard.Test the complete lifecycle with your test user:
- Remove and restore an administrator group membership, confirming the role changes.
- Deactivate the user in Okta, confirming access and active sessions are revoked.
- Reactivate the user, confirming a new SSO login works but an old session does not.
- If you use the CLI, run its device login and confirm browser approval uses Okta SSO.
Prepare gateway access for CLI users
SSO authenticates the dashboard and CLI device-authorization browser flow. Gateway access is a separate downstream dependency. Ifblue.yaml contains the top-level gateway section, finish gateway setup before asking users to run blue login.
Confirm:
- LiteLLM is running and reachable from the Control API.
- The inference proxy is running and its public URL is reachable from the user’s machine.
LITELLM_MASTER_KEYis available to the deployment asHARNESS_LITELLM_ADMIN_KEY.HARNESS_GATEWAY_URL,HARNESS_INFERENCE_PROXY_URL, and the inference proxy’s OAuth client-credentials settings (HARNESS_PROXY_OAUTH_TOKEN_URL,HARNESS_PROXY_OAUTH_CLIENT_ID,HARNESS_PROXY_OAUTH_CLIENT_SECRET,HARNESS_PROXY_OAUTH_RESOURCE) are configured.- A LiteLLM user exists with the exact SCIM email, ignoring case.
- The configured provisioner’s account, team, and policy requirements are satisfied. The provided local Compose provisioner requires the LiteLLM user to belong to at least one team.
- Blue can create or update one managed key for that user. The shipped LiteLLM provisioners use
blue:<email>as the base alias and add a numeric suffix when it is occupied.
blue status should report matching desired and applied revisions with managed files present.
Identity lifecycle behavior
Dashboard administrators can revoke sessions for managed users, but role and lifecycle changes must come from the identity provider. Invitations are disabled in OIDC mode.
Roll out from password authentication
SCIM endpoints are enabled wheneverscim_bearer_token is configured, independently of authentication mode. OIDC mode requires SCIM configuration, and ordinary local password login is disabled as soon as you switch modes. Plan a short controlled migration:
- Create the Okta OIDC and SCIM applications and prepare all deployment secrets.
- Back up the database and confirm the bootstrap administrator credentials work.
- Deploy
HARNESS_AUTH_MODE=oidcand verify SCIM discovery. - Immediately provision a small test group, validate login, then provision the remaining users.
- Push administrator groups only after confirming their names and membership.
Rotate secrets
The deployment accepts one SCIM bearer token at a time. Coordinate rotation so Okta and Blue change together:- Generate a new high-entropy token.
- Update Okta and the deployment secret in the same maintenance window.
- Restart the Control API.
- Test API credentials in Okta and trigger a test user update.
HARNESS_OIDC_CLIENT_SECRET, restart the dashboard, and complete a new SSO login.
Do not rotate BETTER_AUTH_SECRET as though it were an OIDC client secret. It protects Better Auth data at rest, including the private signing key stored in the database. A planned rotation must replace or re-encrypt that stored key and intentionally invalidate sessions; changing only the environment variable breaks OAuth token issuance.
Troubleshooting
Configuration reference
The SCIM bearer token and group-role mappings may instead be supplied in
blue.yaml as control_api.identity.scim_bearer_token and control_api.identity.group_role_mappings.
