vyvoj-dash

Run 01-03: Login/logout + middleware + protected

Dokončeno

Uzavřít MVP auth flow: login, logout, middleware, /account, env vars, dev cookie

Od: 2026-05-18 Do: 2026-05-18 Vytvořeno 18. 5. 2026

7/7

100%

Tasky v runu

Otevřít kanban →
ID Název Status Priorita Vytvořeno
163 Zapojení env vars do session cookie + dev/prod Secure flag
Cookie attributes (HttpOnly/Secure/SameSite) byly hardcoded a env vars (SESSION_COOKIE_NAME, SESSION_TTL_DAYS) viseli nezapojené. Vznikl nový auth/config.ts který přes Effect.gen čte env a vrátí CookieConfig (name, maxAge, secure z import.meta.env.PROD); pokud chybí cookie name, fail s ConfigMissing. Session cookie serialize/clear přijímá secure: boolean — dev běh bez HTTPS funguje.
Hotovo
Střední
18. 5. 2026
164 Login endpoint
Nový endpoint src/pages/api/auth/login.ts — POST form/JSON, findByEmail → verify PBKDF2 → vytvoří session a vrátí cookie. UserNotFound i wrong_password se klientovi vrací jako jeden tag invalid_credentials, aby chyba neodhalila existenci účtu. Login schema (src/auth/schemas/login.ts) vyžaduje jen přítomnost hesla, ne min 8, kvůli legacy slabým heslům.
Hotovo
Střední
18. 5. 2026
165 Login form stránka
Nová stránka src/pages/login.astro mirroring signup form — prerender=false, error banner z URL query (invalid_credentials/validation/internal), link na signup. Czech labels.
Hotovo
Střední
18. 5. 2026
166 Logout endpoint
Nový endpoint src/pages/api/auth/logout.ts — idempotent (vždy 303 → /), revoke session když cookie existuje, clear-cookie header. Žádný 404 při chybějící cookie aby logout fungoval i po expiraci.
Hotovo
Střední
18. 5. 2026
167 Auth middleware
Nový src/middleware.ts s defineMiddleware — parse session cookie, lookup přes Session service, populate Astro.locals.user + locals.session. SessionExpired catchTag → silent Option.none (uživatel se chová jako anonymní). DbError i ConfigMissing v middleware se logují a fallthrough na null locals (nezhroutí stránku).
Hotovo
Střední
18. 5. 2026
168 Protected /account stránka
Nová stránka src/pages/account.astro — prerender=false, čte Astro.locals.user, redirect na /login pokud null. Per-page guard místo middleware-driven redirect (žádný hidden seznam protected rout).
Hotovo
Střední
18. 5. 2026
169 Sprint 001 audit
pnpm tsc --noEmit a pnpm astro check oba běží clean. Jeden typecheck error po prvním write (passwordHash je nullable v schema, login musí na null branch vrátit no_password) opraven přidáním passwordHash null guardu v login.ts před verify.
Hotovo
Střední
18. 5. 2026

Screenshoty

0

Žádné screenshoty. Nahraj první.