Files
teamvis-selfhost/supabase/migrations/0026_magic_link_tokens.sql
T
2026-06-25 16:38:31 +02:00

40 lines
1.7 KiB
SQL

-- 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/<token>.
-- 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.