# AUTH v2 — Spezifikation ## Übersicht Simple Authentifizierung für Luna Recipes, damit mehrere User die App nutzen können. ## Auth-Methode - **Email + Passwort** (primär) - **Optional: PIN-Login** (4-6 Ziffern, für schnellen Zugang auf vertrautem Gerät) - **Kein OAuth/Social Login** — zu komplex für v2 ## Token-Strategie - **JWT Access Token** — kurze Laufzeit (15 min) - **Refresh Token** — lange Laufzeit (30 Tage), httpOnly Cookie - Token-Rotation bei jedem Refresh - Logout invalidiert Refresh Token ## Multi-User Support - Vorgesehene User: **Luna**, **Marc**, **Gäste** - Gast-Zugang: Read-only, kein Login nötig (Feature-Flag) - Jeder User hat eigene Favoriten und Notizen - Rezepte gehören einem User (created_by) - Einkaufsliste: Shared per Haushalt (alle sehen dieselbe) ## Datenmodell-Änderungen ```sql CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email TEXT UNIQUE NOT NULL, name TEXT NOT NULL, password_hash TEXT NOT NULL, pin_hash TEXT, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Bestehende Tabellen erweitern: ALTER TABLE recipes ADD COLUMN created_by UUID REFERENCES users(id); ALTER TABLE notes ADD COLUMN user_id UUID REFERENCES users(id); ALTER TABLE favorites ADD COLUMN user_id UUID REFERENCES users(id); ``` ## API-Endpunkte - `POST /api/auth/register` — { email, password, name } - `POST /api/auth/login` — { email, password } → { accessToken, user } - `POST /api/auth/refresh` — Cookie → { accessToken } - `POST /api/auth/logout` — Invalidiert Refresh Token - `GET /api/auth/me` — Aktueller User ## Sharing - Rezept-Links sind öffentlich teilbar (kein Login zum Ansehen nötig) - Format: `/recipe/:slug` (bleibt gleich) - Optional: "Rezept kopieren" Button für eingeloggte User ## Migration - Alle bestehenden Rezepte werden dem Default-User (Luna) zugewiesen - Bestehende Favoriten/Notizen → Luna - Keine Breaking Changes für nicht-eingeloggte Nutzung in v2.0 ## Nicht in v2 - Social Login (Google, Apple) - Email-Verifizierung - Passwort-Reset per Email - Admin-Panel - Rollen/Permissions