--- import Base from '../layouts/Base.astro'; import { getDb } from '../lib/db'; import { login, getSessionUser, SESSION_COOKIE } from '../lib/auth'; import { rateLimit } from '../lib/rate-limit'; import { safeNext } from '../lib/safe-next'; export const prerender = false; const dest = safeNext(Astro.url.searchParams.get('next')); // Già loggato → via dal login. const existing = Astro.cookies.get(SESSION_COOKIE)?.value; if (existing && getSessionUser(getDb(), existing)) return Astro.redirect(dest); let error = ''; if (Astro.request.method === 'POST') { if (!rateLimit(`login:${Astro.clientAddress}`, 5, 15 * 60 * 1000)) { error = 'Troppi tentativi: riprova tra 15 minuti.'; } else { const form = await Astro.request.formData(); const token = login(getDb(), String(form.get('username') ?? ''), String(form.get('password') ?? '')); if (token) { Astro.cookies.set(SESSION_COOKIE, token, { httpOnly: true, sameSite: 'lax', path: '/', secure: import.meta.env.PROD, maxAge: 7 * 24 * 3600, }); return Astro.redirect(safeNext(String(form.get('next') ?? '') || dest)); } error = 'Credenziali non valide.'; } } ---

Accedi

{error && }