-- Self-Service-Portal: Magic-Link-Auth für Mitarbeiter. -- ==================================================================== -- Zweck: Mitarbeiter pflegen Foto, Mobil- & Social-Links eigenständig, -- ohne Admin-Login. Auth läuft über Magic-Link an die Dienst-E-Mail. -- -- Flow: -- 1. MA gibt seine Dienst-E-Mail auf /portal ein. -- 2. Server findet Mitarbeiter, erzeugt Token (24 Zeichen URL-safe), -- schreibt Zeile in magic_link_tokens, sendet Mail mit -- https://team.stwhas.de/portal/auth/. -- 3. MA klickt Link → Token wird konsumiert (used_at gesetzt) → -- portal_session-Cookie gesetzt → Redirect /portal/edit. -- 4. Auf /portal/edit darf MA nur das eigene Profil bearbeiten, -- nur die im Form sichtbaren Felder (siehe portal/edit/actions.ts). -- -- Sicherheit: -- - Token gültig 30 Min, einmalig konsumierbar. -- - Bei Verdachts-Re-Use des Tokens (used_at != null und erneut -- abgerufen) → Login verweigert + Audit-Log-Eintrag. -- - Tabelle ist anon-blockiert (RLS), nur Service-Role greift zu. create table if not exists public.magic_link_tokens ( id uuid primary key default gen_random_uuid(), employee_id uuid not null references public.employees(id) on delete cascade, token text not null unique, expires_at timestamptz not null, used_at timestamptz, created_at timestamptz not null default now(), ip text ); create index if not exists magic_link_tokens_token_idx on public.magic_link_tokens (token); create index if not exists magic_link_tokens_employee_idx on public.magic_link_tokens (employee_id, created_at desc); alter table public.magic_link_tokens enable row level security; -- Keine Policy → anon hat keinen Zugriff. Service-Role umgeht RLS.