-- Migration 028 — Google OAuth (OIDC) sign-in. -- -- google_sub is Google's stable subject identifier — the join key for a linked -- or auto-provisioned account (unique, but NULL for password-only users). -- email is captured for display + domain checks. password_hash becomes nullable -- so an OAuth-only account can exist without a local password; such an account -- simply can't use the password login path until an admin sets one. ALTER TABLE users ADD COLUMN IF NOT EXISTS google_sub TEXT; ALTER TABLE users ADD COLUMN IF NOT EXISTS email TEXT; ALTER TABLE users ALTER COLUMN password_hash DROP NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS idx_users_google_sub ON users(google_sub) WHERE google_sub IS NOT NULL;