- OIDC - federated login against your own IdP (Okta, Auth0, Google Workspace, Azure AD, etc.). The primary path for real users.
- Break-glass admin - a single email + password configured via env vars, always available regardless of OIDC state. Permanent escape hatch, not a stopgap.
Break-glass admin
Why it’s permanent
The break-glass admin exists for two scenarios:- Initial bootstrap - you need to log in BEFORE OIDC has been configured, to mint your IdP credentials and run a setup wizard.
- OIDC misconfiguration - your IdP’s discovery endpoint went down, your IdP’s clock skewed past JWT expiry, somebody rotated client secrets. The break-glass account lets the on-call engineer log in without rolling back the deployment.
Configuring it
Two ways to set the password:Signing in
POST to/api/auth/break-glass/login:
Rotating
Bump the Secret + bounce the Pod:OIDC
Endpoints
The control plane mounts:GET /api/auth/oidc/login- top-level navigation kicks off the IdP redirect.GET /api/auth/oidc/callback- your IdP redirects here on success.
IdP-specific recipes
- Okta
- Auth0
- Google Workspace
- Azure AD
- In Okta admin, create a new OIDC - Web Application.
- Sign-in redirect URI:
https://radar.acme.example/api/auth/oidc/callback. - Sign-out redirect URI:
https://radar.acme.example(optional; only used if your IdP advertisesend_session_endpoint). - Grant types: Authorization Code + Refresh Token.
- (Optional) Add a Groups claim to the ID token; default name is
groups.
Role mapping
The control plane maps an OIDC ID-token’s group claim to one of three roles:owner- full admin (mint cluster tokens, manage members, view audit log).member- read + cluster operations (the default).viewer- read-only.
- Read the configured
groupClaimvalue from the ID token. Leave it empty to disable group-based promotion. - If any of those values is in
adminGroups, the user isowner. - Otherwise, the user is
defaultRole(defaultmember).
Session lifetime
The control plane mints a sealed session cookie scoped to its own lifetime - it does NOT silently refresh against the IdP. When the cookie expires (default 7 days), the web app shows the login page and the user re-auths through the IdP.IdP offboarding behavior
Because the cookie is the freshness signal (not a per-request IdP probe), there is a window between an IdP-side change and the control plane catching up:- User removed from the IdP keeps a working session until the cookie expires (≤ 7 days) or they sign out. To force-revoke immediately: have an owner remove them from the org via Settings → Members. That cuts org-scoped access right away; the user’s stale cookie still authenticates them as a person but resolves to no org membership.
-
Group changes do NOT auto-propagate to existing users. First sign-in resolves a Radar role from
adminGroupsmembership and writes it toorg_members. Subsequent sign-ins do not re-resolve -ON CONFLICT DO NOTHINGon the join row. Both directions are affected:- A new admin added to
adminGroupsafter their first login stays at their original role until an owner promotes them via Settings → Members. - A demoted user removed from
adminGroupsretains theirownerrole in Radar until an owner adjusts it.
PATCH /api/orgs/{id}/members/{user_id}from your IdP webhook. Built-in two-way sync is on the GA roadmap. - A new admin added to
Sign-out
The web app’s sign-out button callsPOST /api/auth/signout, which clears the session cookie and (when the IdP advertises end_session_endpoint in discovery) returns a redirect URL to the IdP’s logout page. Most IdPs advertise this; Google does not.
Personal Access Tokens
PATs (rhp_*) work identically to Cloud:
- Mint via Settings → Access tokens (logged-in user only mints their own).
- Pin to a single org at mint time.
- Used as
Authorization: Bearer rhp_...for MCP,skyhook-cli, and any script that can’t carry a browser cookie.