- 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.
Configuring OIDC from the web app
The hub ships a Settings → SSO (Single Sign-On) page. Enter your issuer, clientID, and clientSecret and it generates the exactkubectl create secret generic radar-hub-oidc --from-literal=client-secret=... plus the helm upgrade ... --set-string auth.oidc.issuer=... --set-string auth.oidc.clientID=... --set auth.oidc.clientSecretExistingSecret=radar-hub-oidc command for you, and shows the redirect URI to register at your IdP. It’s a convenience wrapper - the Helm values remain the source of truth.
Roles
Radar has three roles:owner- full admin (mint cluster tokens, manage members, view audit log).member- read + cluster operations (the default).viewer- read-only.
- The first user to sign in - via OIDC or break-glass - bootstraps the org and becomes
owner. - Every subsequent new user joins as
auth.oidc.defaultRole(defaultmember). - An owner promotes or demotes anyone else from Settings → Members in the web app.
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.
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.