Sign-in per deployment
The OIDC client
Create a confidential OIDC client for xpander at the identity provider:/auth uses https://idp.example.com/auth/realms/<realm>. It also holds the client ID and secret, and optional extra scopes. An optional API service app card adds a second client’s ID and secret, plus a generated Directory key. Directory reads and agent token exchange use this second app; Okta needs key-pair authentication on it. The page also has the agent pre-authentication switch.
The token and userinfo calls run from inside the cluster, so the IdP must be reachable from the pods, not only from the browser; an IP-restricted public entry point refuses them.

Settings > OIDC: issuer, client, scopes and the API service app card. Shown with sample data.

Settings > OIDC: the three redirect URIs and the Agent pre-authentication card with its switch, Audiences and Token exchange scopes. Shown with sample data.
Group sync
Group membership from the IdP maps to xpander user groups through agroups claim. The recipe, for Keycloak:
- At the IdP, a client scope named
groupswith a Group Membership mapper (claimgroups, full path off, in userinfo), assigned to the xpander client as an optional scope. A mapper on the client alone is not enough: xpander requestsscope=groups, and Keycloak answerserror=invalid_scopewhen no client scope of that name exists. - Settings > OIDC > Additional sign-in scopes: Add, type
groups, Save configuration. - After the next sign-in the values the IdP sent are known to xpander. Under Settings > User groups, open the group row’s menu (three dots) and choose Link SSO groups. The dialog lists the observed values, takes a value typed by hand, and saves with Save links. The row then shows an SSO badge.
- Members of the linked identity-provider groups join the xpander group at their next sign-in.

Link SSO groups: the observed identity-provider values, a manual entry field and Save links. Shown with sample data.

Settings > User groups after Save links: the group carries an SSO badge and names the linked identity-provider group. Shown with sample data.
/ signed out with no message; the error= parameter is on the callback request in the browser’s network log. The Keycloak screens, the preferred_username mapper and the failure table are on SSO with your identity provider.
Agent pre-authentication
Agent pre-authentication uses OIDC token exchange. At the moment of a call, xpander exchanges the asking person’s sign-in token for one scoped to the target system, so the agent acts with that person’s permissions where the outside system allows it. The IdP client needs token exchange enabled (Keycloak 26: the client attributestandard.token.exchange.enabled=true), direct access grants, an audience client for the target system, and a client scope with an audience mapper. In xpander, Settings > OIDC > Agent pre-authentication holds the Enable agent pre-authentication switch, Audiences (one per target system) and Token exchange scopes. Save configuration applies them. Leave it off to start.
Self-hosted chart values
preferred_username mapper, the failure table and the pods to read logs from are on SSO with your identity provider.
