Přeskočit obsah

Auth: Magic Link jako jediný login flow, OAuth providery zatím nezapínáme

Date: 2026-05-14 Status: Accepted

Context

Současný auth má Google OAuth + email/heslo fallback. Staff reálně používá M365 (ne Google), rodičovský portál se spouští do 3 měsíců a potřebuje nový login flow, a Tomáš zvažuje přechod tenantu z M365 na Google Workspace (rozhodnutí pohyblivé). Apple Sign-In byl zvažován pro rodiče, ale stojí $99/rok + JWT overhead bez měřitelného benefitu nad magic linkem.

Decision

V produkci je jediný login flow Magic Link (Supabase Email/OTP) pro všechny role — staff, rodiče, později žáky. Žádné heslo, žádný OAuth provider zapnutý. Dev quick-login (KOSMO_DEMO_MODE) funguje passwordless přes Supabase Admin API (admin.generateLink).

Alternatives considered

  • Microsoft Azure SSO pro staff — odložen. Cementoval by M365 tenant, vyžaduje Entra App registration a secrets. Až bude měřitelná potřeba (staff stěžuje na friction, ruční offboarding zatěžuje), 1 PR ho zapne vedle magic linku.
  • Google OAuth pro staff — odložen. Staff dnes na M365, Google Workspace přechod není rozhodnut. Magic link je provider-agnostic.
  • Apple Sign-In pro rodiče — zamítnuto. $99/rok Apple Developer + JWT key rotation overhead, App Store guideline 4.8 nás na webu netlačí, magic link pokrývá stejný UX univerzálně (rodič se gmail/seznam/icloud přihlásí stejně).
  • Custom SMTP (Resend) v Supabase Auth — neimplementujeme zatím. Tomáš preferuje default Supabase mailer + upgrade na Supabase Pro ($25/měsíc) pro vyšší rate limit. Pokud doručitelnost ze noreply@mail.app.supabase.io bude problém, později přepneme na Resend.
  • Password fallback v produkci — shozen. Žádný staff ho aktivně nepoužívá, drží zbytečný attack surface.

Consequences

Usnadňuje: - Setup ~zero — žádný OAuth tenant config, žádné Vercel secrets pro OAuth. - Provider-agnostic — M365 ↔ Google přepínatelné bez dotyku na auth. - Jeden code path, jeden login flow → menší údržba a attack surface.

Komplikuje: - Závislost na e-mailové doručitelnosti (Supabase mailer down nebo SPF reputation problém = nikdo se nepřihlásí). - Žádný auto-offboarding přes Workspace admin — Tomáš musí ručně mazat účty v Supabase (pro 10 učitelů triviální). - Pro 100 rodičů potřebujeme Supabase Pro upgrade ($25/měsíc) — Free tier mailer má rate-limit 4 maily/h.

Dluh: - Refresh token expiry 1 rok — pokud chceme přísnější session policy (např. force re-auth každý týden), bude potřeba změnit v Supabase Auth config. - Doručitelnost ze sdílených Supabase domén je horší než z dedicated SPF/DKIM; pokud rodiče budou hlásit „odkaz nedorazil", custom SMTP je další PR.

Revisit when

  • Staff explicitně stěžuje na friction magic linku (např. „nemůžu se přihlásit z mobilu na hodině") → zvážit Azure / Google SSO.
  • Tomáš dokončí rozhodnutí M365 ↔ Google Workspace → zapnout odpovídající provider vedle magic linku.
  • Žákovský portál (Fáze 3+) → zapnout Google Workspace for Education provider.
  • Doručitelnost ze Supabase default mailer klesne pod akceptovatelnou úroveň → přepnout na custom SMTP (Resend).
  • Sofie přijme druhou školu s vlastním tenantem → multi-tenant auth strategie, vlastní design review.