Skip to content

S60Auth

Vlastní OAuth2/OIDC identity provider — login, social login, JWT token issuance, lazy password migrace.

Owner auth (agent)
Status running
Repo studio60-cz/auth
Stack NestJS + PostgreSQL + Redis + React (frontend) + @s60/auth-sdk
Catalog catalog/services/s60auth.yaml

URLs

Env URL HC
dev https://auth.s60dev.cz /.well-known/openid-configuration
hub https://auth.s60hub.cz stejně
prod https://auth.studio60.cz stejně

Komponenty

Container Port Role
s60-auth-backend 3002 NestJS API (OAuth2/OIDC provider)
s60-auth-frontend 3003 React SPA (Nginx static serve)
  • @s60/auth-sdk: sdílený package — JwtAuthGuard + Redis blacklist (každá app validuje JWT lokálně, bez ForwardAuth)

OAuth provider credentials

  • Google OAuth: /root/secrets/shared/google-oauth.env (sdílené napříč prostředími)
  • Facebook OAuth: /root/secrets/shared/facebook-oauth.env

DB

Env DB User Server Port
Hub s60_auth_hub s60_auth_hub_user hub-alfa (pg-alfa) 6432
Prod s60_auth_prod s60_auth_prod_user prod-alfa (pg-alfa) 6432
Dev (cerebro pg-alfa) cerebro 6432

⚠️ Migrace na pg-alfa proběhla 2026-04-10 — staré usery s60_hub_user + s60_prod_user smazány, nahrazeny s60_auth_hub_user + s60_auth_prod_user.

Závislosti

  • postgres-managed (pg-alfa, port 6432)
  • redis (token cache + blacklist)

Klíčová architektonická rozhodnutí

ForwardAuth removed (2026-03-12)

  • Před: Nginx ForwardAuth zavolal S60Auth, ten validoval token a vracel x-user-id/x-user-email headers
  • Po: Každá aplikace si validuje JWT lokálně přes @s60/auth-sdk JwtAuthGuard se sdíleným JWT_SECRET + Redis blacklist
  • Důvod: latence, single point of failure, headers manipulation risk

Lazy password migrace

  • Stará hesla v BCrypt nebo SHA256
  • Při úspěšném loginu se hash automaticky upgraduje na Argon2
  • Až jednou bude vše migrováno, dropnou se stará pole

Social login

  • Google + Facebook
  • Auto-link by verified email (security: SSO provider must verify email)

Features (z catalog)

  • OAuth2 / OpenID Connect provider
  • Social login (Google, Facebook)
  • Lazy password migrace (BCrypt/SHA256 → Argon2)
  • JWT tokens (userId, email, system roles)
  • Redis token cache (TTL synchronizovaný s JWT expiry)

QA users

QA user setup vyžaduje 3 kroky, ne jen registraci:

  1. Záznam v users (registrace)
  2. Záznam v user_system_access (povolený přístup k systému)
  3. Záznam v user_system_roles (jinak rolesBySystem v JWT je prázdné → AuthGuard 401)

Pulse navíc potřebuje tier + credits v clients tabulce.

Detail: runbooks/qa-user-setup.md.

Secrets

  • /root/secrets/auth/.env.hub
  • /root/secrets/auth/.env.prod

Poslední deploy

  • 2026-08-01 — commit cbffa6f hub (10:26 UTC) + prod (10:32 UTC) — REQ-054 fáze 1+2+3 (e-mailové aliasy, provisioning) + REQ-056 fáze 1 (merge identit) + REQ-053 error tracking + REQ-055 /data-deletion/ + oprava mrtvého Turnstile tlačítka. Cíl = doc commit cbffa6f, ne kódový 88fded1 (ten má stale DEPLOY.md se dvěma migracemi místo tří).
  • 3 migrace 1753…UserEmails + 1754…UserExternalRefs + 1755…IdentityMerge; pre-flight 0/0 na obou DB
  • backfill: hub 19/19, prod 388/388, žádný uživatel bez záznamu; user_external_refs a merged_into prázdné dle očekávání
  • build hash e1aaa43c identický hub↔prod; QA gate hub 4/4 (e2e login 20/20)
  • ⚠️ REQ-053 FE Sentry se NEZAPEKLdocker-compose.yml (auth repo) nemá u s60-auth-frontend sekci args:, takže VITE_SENTRY_DSN/VITE_SENTRY_ENVIRONMENT nedorazí do buildu, ačkoli je frontend/Dockerfile deklaruje. Ověřeno na served bundlu: Turnstile key ANO, Sentry DSN NE. Nahlášeno auth (T-20260801-098), oprava je na jejich straně.
  • ⚠️ Turnstile enforcement běží už od 31. 7. — tenhle deploy nebyl aktivace, ale oprava tlačítka; do té doby nemohl nikdo s blokovaným CF skriptem dokončit registraci
  • 2026-05-22 15:30 UTC — commit 6c03148 prod (skok z předch. prod commit; 4 specs REQ-039 + CR-002 + CR-003 + REQ-040; migrace 1747800000000-AddVerificationAndLegalUrls applied id 5 — 3 columns na systems: gdpr_url + terms_url (VARCHAR NULL) + email_verification_policy (VARCHAR NOT NULL DEFAULT 'none'); 15/15 prod systems default 'none' → zero breaking change; /api/health 200, openid issuer https://auth.studio60.cz, 0 ERROR post-deploy; pre-deploy backup auth-db/prod-pre-6c03148-20260522-152632.dump 96 KB; hub re-deploy required pro refresh 2h validation window)
  • 2026-05-21 10:09 UTC — commit 6c03148 hub (T-20260521-015 + T-20260521-022 DEPLOY.md fix; target 17559b5 + DEPLOY.md update 6c03148; 4 specs REQ-039 OAuth prompt + CR-002 email verify magic-link + CR-003 GDPR/Terms URL + REQ-040 verification policy; migrace 1747800000000-AddVerificationAndLegalUrls applied; 12 hub systems default 'none')

Související