40 lines
1.7 KiB
SQL
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.
|