3.3 KiB
3.3 KiB
What's pre-wired, and the env vars
src/lib/auth/
| File | Use it for |
|---|---|
client.ts |
Browser client. signIn(providerId), signOut(), authEnabled, GROK_PROVIDERS. |
server.ts |
The Better Auth instance (server-only). Do not edit or rewrite. Import only from /api/auth/$. |
email-password.ts |
Only place to enable local email/password (emailAndPasswordEnabled = true). |
popup.server.ts |
Live-preview popup handler (server-only). Already wired by the Vite plugin — do not create a route for it. |
providers.ts |
GROK_PROVIDERS — the fixed broker upstream list (Google and X only; don't add others). |
use-current-user.ts |
useCurrentUser() / useCurrentUserState() React hooks. |
gates.tsx |
SignedIn, SignedOut, RedirectToSignIn, UserButton. |
middleware.ts |
authMiddleware for server functions → verified context.userId. |
verify.server.ts |
requireUserId() / getSessionUser() (server-only) for manual wiring. |
How each mode gets its credentials
- Live preview (
*.grok-sandbox.com): the app is an embedded iframe, so sign-in opens a popup (a top-level redirect to the broker can't work inside the iframe) and federates via a baked shared preview client (src/lib/auth/preview.ts). The handler 302s straight to the broker/upstream login; on return the popup posts the session bearer back in a tiny HTML page. Sessions (and email/password users) persist in the app's embedded PGLite DB — the SAME DB as app data — and, since the iframe's cookies are partitioned, ride that bearer token; all of it lives insrc/lib/auth. Restarting the preview resets the DB. - Deployed: the deployer injects a per-app client +
DATABASE_URL, so sign-in persists identities in Postgres.
Env vars — do not create a .env file
Never write a .env / .env.local / .env.example for auth (or anything
else) in this sandbox. Live preview sign-in works out of the box with zero
env configuration: the server falls back to the baked preview client in
src/lib/auth/preview.ts, derives the *.grok-sandbox.com origin per-request,
mints a process-stable session secret, and persists sessions in embedded
PGLite. Deployed apps get GROK_AUTH_* / BETTER_AUTH_* / DATABASE_URL
injected by the platform — still not something you write into a file.
Optional process-env knobs (platform / rare overrides only — do not put these in a file you create):
| Var | Where | Purpose |
|---|---|---|
VITE_AUTH_ENABLED |
client | "false" in the shipped .grok/app-env.json (dev user); drop the key to turn sign-in ON. Only client-visible auth flag |
BETTER_AUTH_URL |
server | app's own public origin; unset in preview (origin is derived per-request) |
BETTER_AUTH_SECRET |
server | signs this app's own sessions (process-stable fallback in preview; survives HMR) |
GROK_AUTH_ISSUER |
server | the shared broker (defaults to https://auth.grok.me) |
GROK_AUTH_CLIENT_ID / GROK_AUTH_CLIENT_SECRET |
server | per-app client (falls back to the preview client) |
DATABASE_URL |
server | when deployed, Better Auth persists here (preview persists to the embedded PGLite — same DB as app data) |
Never expose a non-VITE_ var to the client. The preview client id/secret live
server-only in src/lib/auth/preview.ts.