auth: route Google login via central Klonkt broker (no credentials per instance)
The instance no longer talks directly to Google but delegates to the central
broker (license.klonkt.com): it performs the OAuth dance with one Google client
and returns a signed, audience-bound identity token, which we verify offline
against the broker's pubkey. This way no self-hoster needs to create their own
Google client.
- config/google.js: broker client (brokerStartUrl + verifyIdentityToken against
/pubkey: issuer + EdDSA + audience==SITE_ORIGIN + typ; consumeJti against replay).
- routes/auth.js: /auth/google sets state in session -> broker; callback checks
state (CSRF) + token + replay, finds-or-creates user on email.
- god only via ADMIN_EMAIL; the "first user becomes god" bootstrap only applies
when NO ADMIN_EMAIL is set (otherwise a stranger on a fresh install could become
owner).
- Reject login if the email address is already linked to a different google_sub.
- jose added to dependencies (verifier; otherwise npm ci crashes the app).
- .env: KLONKT_BROKER_URL + SITE_ORIGIN instead of GOOGLE_CLIENT_ID/SECRET.
Co-Authored-By: Claude <noreply@…>