{proxy_base_url}/sso/key/generate, bounces to your provider, and your provider redirects back to {proxy_base_url}/sso/callback, which the dashboard’s nginx routes to the backend
You need admin access to configure this. Sign in with the local admin (username
admin and your LITELLM_MASTER_KEY) so you have the full sidebar, since an SSO user with a limited role cannot reach these pagesPrerequisites
- An OIDC provider and its discovery document (the
.well-known/openid-configuration), which gives you the authorization, token, and userinfo endpoints - The URL your users open the dashboard at, for example
http://localhost:3000. This is yourproxy_base_url - Permission to create a client in your provider
Step 1: Create a client in your provider
In Keycloak, open your realm and go to Clients -> Create client:1
Client basics
Client type OpenID Connect, and a Client ID you will paste into the dashboard, for example
forceai-ui2
Enable the browser login flow
Turn Client authentication on (this makes it confidential and gives it a secret) and enable the Standard flow (authorization code). A bearer-only or service-account-only client cannot complete the browser login
3
Register the callback
Set Valid redirect URIs to
{proxy_base_url}/sso/callback, for example http://localhost:3000/sso/callback, and Web origins to {proxy_base_url}, for example http://localhost:30004
Copy the secret
Save, then open the Credentials tab and copy the client secret. The Client ID and this secret are the only two values that are not in your discovery document
Step 2: Configure SSO in the dashboard
Go to Admin Settings -> SSO Settings -> Configure SSO, pick the generic OIDC provider, and fill the fields. Everything except the Client ID and secret comes straight from your discovery document
Save. The Proxy Base URL must be the same origin you registered the callback against in step 1
Step 3: Test the login
1
Keep the config tab open
Do not close the tab where you just saved, so you can fix the config if the login fails
2
Log in from a new tab
Open a new tab, go to the dashboard, and click Login with SSO. You should bounce to your provider, sign in, and land back in the dashboard
Map users to roles
The role decides the sidebar and admin powers. With nothing configured, every SSO user falls through to the default role (a restricted internal viewer), which is why a fresh SSO user sees a stripped-down sidebar. The role is decided at each login in this order:- If the user’s email equals the Proxy Admin Email in the config, they become
proxy_admin - Else if Role Mappings are on and a value in the group claim matches, they get the mapped role
- Else they get the default role
By email (one admin)
Set Proxy Admin Email to that user’s email in the SSO config. Simplest for a single admin. It only elevates that one addressBy group (scalable)
Map a directory group or role to a ForceAI role so membership drives access:1
Expose the groups in the token
Realm roles already arrive as
realm_access.roles. To use groups instead, add a Group Membership mapper on the client’s dedicated scope with claim name groups and “Full group path” off2
Turn on Role Mappings
In the SSO config, enable Use Role Mappings, set Group Claim to
realm_access.roles (or groups), and map for example forceai-admin to Proxy Admin and forceai-user to Internal User3
Assign users in your provider
Add users to those groups or roles. On their next login the role is applied
ForceAI sets the role on the user record at login. A user who already logged in with the default role is upgraded on the next login once the email or mapping matches. If it does not flip, set the role once on the Internal Users page and SSO keeps it in sync afterward
Map users to access groups
Role controls the sidebar; access groups control which skills, models, agents, and MCP servers a user may actually call. The Access Group Mappings section sits right below Role Mappings and uses the same group claim. Map a directory group to an access group id, for examplepinesmith-traders to ag-traders, and members of that group inherit that access group. One group can both set a role and unlock a capability set
Troubleshooting
“Invalid parameter: redirect_uri” on the provider’s page. The callback ForceAI sent is not registered on the client. ForceAI sends{proxy_base_url}/sso/callback. Add that exact URL to the client’s Valid redirect URIs, and confirm the Client ID in the config matches the client you edited
The login works but the sidebar is limited. The user got the default role because no email or group mapping matched. Set the Proxy Admin Email or configure Role Mappings, then log out and back in
The token exchange fails after the provider login. The backend calls the token and userinfo endpoints server to server, so the backend container must have outbound network access to your provider’s host. If the provider is on a private network, make sure the backend can reach it
The callback is http://localhost but the issuer is HTTPS. That is fine. The browser handles the local callback while the backend talks to the HTTPS provider directly