This guide configures the Autopilot dashboard to sign users in with Google OAuth/OIDC
instead of Xano. It is an alternative to the default Xano method; exactly one method is
active per cluster. Authorization (who can do what) is unchanged — a Google-authenticated
user is resolved against the same AccessPolicy by email.
Auth is gated by auth.enabled (default false). Enabling Google on a cluster is a
deliberate, per-cluster opt-in. Rollback is instant: flip the method back to xano or set
auth.enabled=false and redeploy.
Prerequisites
- A Google Cloud project where you can create OAuth credentials.
- The dashboard’s external base URL (the dashboard hostname), e.g.
https://ops.xano.com. The OAuth redirect URI is always <base>/api/v1/auth/callback.
- A Google Workspace domain to enforce (e.g.
xano.com) — strongly recommended.
1. Create the OAuth client
In the GCP Console → APIs & Services → Credentials → Create credentials → OAuth client ID:
- Application type: Web application
- Authorized redirect URIs: add
<base>/api/v1/auth/callback for every hostname that will use Google on this cluster, e.g. https://ops.xano.com/api/v1/auth/callback. (The path is always /api/v1/auth/callback.)
Note the generated Client ID and Client secret.
2. Create the client-secret Secret
The client secret is injected from a Kubernetes Secret (read by the kubelet) — it is
never placed in Helm values or git.
The key name (client-secret) is the Helm default (auth.google.clientSecret.secretKey).
3. Set Helm values
In the cluster’s env file (deploy/envs/<tier>/<cluster>.yaml) or a values override:
Hosted-domain enforcement is on by default. Either set allowedDomain, or explicitly
set allowAnyDomain: true to accept any Google account (including consumer @gmail.com,
which carry no hd claim). The controller refuses to start a method=google cluster
unless one of these is satisfied (and clientId + the secret are present) — a fail-fast
startup error, not a silent lockout.
4. Deploy and verify
Deploy the cluster as usual:
Verify:
- Open the dashboard → you should be redirected to
/login, which now shows “Sign in with Google” with the Google glyph.
- Click it → Google’s account chooser appears (scoped to the allowed domain via the
hd hint) → after consent you land back on /app/.
- A first-time user with no grant lands on the access-request screen; an admin approves them on the Access Control → Pending Requests page.
Lockout insurance: set superAdmins (e.g. you@xano.com) — a super-admin resolves to
admin even with no AccessPolicy CRD present, so admin-gated features (terminal, logs)
work immediately. Every other user is resolved against the cluster’s AccessPolicy and needs
a matching grant.
Notes & limitations
- Session length is bounded by the Google ID token’s expiry (~1 hour), so users re-authenticate roughly hourly even though
AUTH_COOKIE_MAX_AGE caps the upper bound at 12h.
- In-flight logins (the ~10-minute window between clicking sign-in and completing the callback) are invalidated if the controller restarts — the user simply clicks sign-in again. This is expected for the single-replica controller (the handshake key is ephemeral/in-memory by design).
- Rollback: set
auth.method: xano (with auth.xano.accountOrigin) or auth.enabled: false and redeploy. The Google code is dormant unless method=google.