# Feature Plan: Server-seitige Sessions für Admin-API

## Kontext
- Ziel: Admin-API auf serverseitige Sessions mit CSRF-Schutz umstellen, Secrets ausschließlich backendseitig halten.
- Initialer Admin wird über einen Setup-Wizard in der Admin-UI angelegt; weitere Admins werden in einer neuen `admin_users`-Tabelle verwaltet.
- Session-Cookies (HttpOnly, Secure, SameSite=Strict) und SQLite-basierter Session-Store.

## Annahmen & Randbedingungen
1. Backend nutzt weiterhin SQLite; Session-Daten liegen in separater Datei (`sessions.sqlite`).
2. Session-Secret (`ADMIN_SESSION_SECRET`) bleibt als ENV-Variable im Backend.
3. Frontend authentifiziert sich ausschließlich via Session-Cookie + `X-CSRF-Token`; keine Bearer-Tokens im Browser.
4. Initialer Admin wird per UI-Wizard erstellt; falls Wizard nicht verfügbar ist, gibt es ein Fallback-CLI/Script.
5. `AUTHENTICATION.md` und `frontend/MIGRATION-GUIDE.md` sind maßgebliche Dokumente für Auth-Flow.

## Aufgaben-Backlog
- [x] **Session Store & Konfiguration**
  - `express-session` + `connect-sqlite3` installieren und konfigurieren.
  - Session-Datei z. B. unter `backend/src/data/sessions.sqlite` speichern.
  - Cookie-Flags gemäß Prod/Dev setzen.

- [x] **Admin User Datenbank**
  - Migration / Schema für `admin_users` inkl. Passwort-Hash (bcrypt) und Meta-Feldern.
  - Seed-/Wizard-Mechanismus für ersten Admin.

- [x] **Login / Logout Endpoints**
  - `POST /auth/login` prüft Credentials gegen DB.
  - `POST /auth/logout` zerstört Session + Cookie.
  - Bei Login `req.session.user` + `req.session.csrfToken` setzen.

- [x] **CSRF Token & Middleware**
  - `GET /auth/csrf-token` (nur authentifizierte Sessions).
  - Middleware `requireCsrf` für mutierende Admin-/System-Routen.
- [x] **Initial Admin Setup Flow (Backend)**
  - `GET /auth/setup/status` liefert `{ needsSetup: boolean }` basierend auf Admin-Anzahl.
  - `POST /auth/setup/initial-admin` erlaubt das Anlegen des ersten Admins (nur wenn `needsSetup` true).
  - UI-Wizard ruft Status ab, zeigt Formular und loggt Admin optional direkt ein.

## Endpoint-Konzept

- `POST /auth/setup/initial-admin`
  - Body: `{ username, password }` (optional `passwordConfirm` auf UI-Seite validieren).
  - Backend: prüft, dass keine aktiven Admins existieren, erstellt Nutzer (bcrypt Hash) und markiert Session als eingeloggt.
  - Response: `{ success: true, csrfToken }` und setzt Session-Cookie.

- `GET /auth/setup/status`
  - Response: `{ needsSetup: true|false }` plus optional `hasSession: boolean`.

- `POST /auth/login`
  - Body: `{ username, password }`.
  - Checks: User aktiv, Passwort korrekt (bcrypt.compare), optional Rate-Limit.
  - Side-effects: `req.session.user = { id, username, role }`, `req.session.csrfToken = randomHex(32)`.
  - Response: `{ success: true, csrfToken }` (Cookie kommt automatisch).

- `POST /auth/logout`
  - Destroys session, clears cookie, returns 204/200.

- `GET /auth/csrf-token`
  - Requires valid session, returns `{ csrfToken }` (regenerates when missing or `?refresh=true`).

- Middleware `requireAdminSession`
  - Prüft `req.session.user?.role === 'admin'` und optional `is_active` Flag.
  - Antwortet mit `403` + `{ reason: 'SESSION_REQUIRED' }` wenn nicht vorhanden.

- Middleware `requireCsrf`
  - Gilt für `POST/PUT/PATCH/DELETE` auf `/api/admin/*` & `/api/system/*`.
  - Erwartet Header `x-csrf-token`; vergleicht mit `req.session.csrfToken`.
  - Bei Fehler: `403` + `{ reason: 'CSRF_INVALID' }`.

- Frontend-Fluss
  - Nach Login/Setup: speichert gelieferten Token im State.
  - Für alle Admin-Requests: `fetch(url, { method, credentials: 'include', headers: { 'X-CSRF-Token': token } })`.
  - Wenn 401/403 wegen Session: UI zeigt Login.

- [x] **Admin-Auth Middleware**
  - `/api/admin/*` + `/api/system/*` prüfen Session (`req.session.user.role === 'admin'`).
  - Alte Token-basierte Checks entfernen.
  - Ergänzt durch neue öffentliche Route `GET /api/social-media/platforms` (Upload/Management), während Admin-spezifische Plattform-Funktionen weiterhin über `/api/admin/social-media/*` laufen.

- [x] **Frontend Admin Flow**
  - `adminApi.js` auf `credentials: 'include'` + `X-CSRF-Token` umbauen.
  - Login-UI + Setup-Wizard für initialen Admin.
  - State-Handling für CSRF-Token (Hook/Context) via `AdminSessionProvider` + `AdminSessionGate`.

- [x] **Secret-Handling & Docker**
  - `docker/prod/docker-compose.yml` und Backend-Configs geben nur noch `ADMIN_SESSION_SECRET` an.
  - Frontend-Build enthält keine sensiblen `.env`-Dateien; Public env-config liefert ausschließlich non-sensitive Werte.
  - Deployment-Dokumentation (`env.sh`, README) beschreibt erlaubte Variablen.

- [x] **Tests & CI**
  - Jest-Suites decken Login/CSRF/Admin-Endpunkte ab (`tests/api/*`, `tests/unit/auth.test.js`).
  - Secret-Grep + Docker-Build-Schritt stellen sicher, dass das Frontend-Bundle keine Admin-Secrets enthält.

- [x] **Mehrere Admins & CLI-Tooling**
  - `POST /api/admin/users` + `AdminAuthService.createAdminUser` für zusätzliche Admins.
  - `scripts/create_admin_user.sh` automatisiert Initial-Setup & weitere Accounts via API.

- [x] **Passwortrotation erzwingen**
  - Flag `requires_password_change`, `POST /auth/change-password`, Frontend-Formular blockiert Dashboard bis zur Änderung.

- [ ] **Key-Leak Reaktionsplan**
  - Anleitung (Scans, History-Cleanup, Rotation) dokumentieren bzw. verlinken.

- [x] **Dokumentation**
  - `AUTHENTICATION.md`, `README(.dev)` und `frontend/MIGRATION-GUIDE.md` beschreiben Session/CSRF-Flow.
  - Feature-Request-Referenzen zeigen auf neue Session-Implementierung.

- [ ] **Kommunikation & Review**
  - Verweise auf relevante Patches/PRs ergänzen.
  - Reviewer-Hinweise (Testplan, Rollout) dokumentieren.
