Skip to main content
Self-hosted has two coexisting auth paths:
  1. OIDC - federated login against your own IdP (Okta, Auth0, Google Workspace, Azure AD, etc.). The primary path for real users.
  2. Break-glass admin - a single email + password configured via env vars, always available regardless of OIDC state. Permanent escape hatch, not a stopgap.
WorkOS is never in the loop. Customer auth events stay inside your VPC.

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.
We recommend leaving it configured permanently. One account, well-protected by a strong password (or pre-hashed bcrypt) in your secret store.

Configuring it

Two ways to set the password:
Or via an existing Secret (see Configuration → Skipping the chart’s Secret).

Signing in

POST to /api/auth/break-glass/login:
Or use the web app’s login page - it renders a “Sign in with email + password” panel when break-glass is configured.

Rotating

Bump the Secret + bounce the Pod:
Sessions issued under the old password remain valid until cookie expiry - rotate cookies + bcrypt together if you suspect the old credential leaked.

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.
You register the callback URL with your IdP. It’s the only URL that needs to match exactly - case-sensitive, no path normalization.

IdP-specific recipes

  1. In Okta admin, create a new OIDC - Web Application.
  2. Sign-in redirect URI: https://radar.acme.example/api/auth/oidc/callback.
  3. Sign-out redirect URI: https://radar.acme.example (optional; only used if your IdP advertises end_session_endpoint).
  4. 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 exact kubectl 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 IdP does authentication (who you are); the hub does authorization (your role) internally - it does NOT read or sync IdP groups. Role assignment:
  1. The first user to sign in - via OIDC or break-glass - bootstraps the org and becomes owner.
  2. Every subsequent new user joins as auth.oidc.defaultRole (default member).
  3. An owner promotes or demotes anyone else from Settings → Members in the web app.
Roles are stored in the hub, not derived from the ID token, so a user keeps their role across logins regardless of any IdP group change.

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 calls POST /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.
The PAT path is decoupled from OIDC and break-glass - tokens validate against a SHA-256 hash in Postgres, no upstream IdP roundtrip per request.