diff --git a/Authentifizierung.md b/Authentifizierung.md new file mode 100644 index 0000000..5b1732a --- /dev/null +++ b/Authentifizierung.md @@ -0,0 +1,43 @@ +# Authentifizierung + +## Nutzertypen + +| Typ | ID-Typ | Beschreibung | +|-----|--------|-------------| +| Gast | `string` (Session-ID) | Temporär, kein Passwort, kein Profil | +| Nutzer | `number` (DB-ID) | Registriert, persistente Stats | +| Admin | `number` + `role: "admin"` | Vollzugriff auf Admin-Panel | + +## Gast-Session + +- Alphanumerischer Name wählbar +- Kann Echtzeit-Partien spielen +- Keine Freunde, keine gespeicherten KI-Partien +- `req.session.user.id` ist ein String + +## Registrierung & Login + +- Benutzername: alphanumerisch, eindeutig +- E-Mail: optional, eindeutig wenn angegeben +- Passwort: gehasht mit **argon2** +- Session via `express-session` (gespeichert in PostgreSQL) + +## Admin-Rolle + +1. `ADMIN_EMAIL` in `.env` setzen +2. Server setzt beim Start: `UPDATE "user" SET role='admin' WHERE email=$1` +3. Nutzer muss sich **neu einloggen** (Session wird aktualisiert) + +Admins sehen im Header einen „Admin"-Button mit Schild-Icon. + +## Session-Middleware + +- `requireAuth` – prüft ob Nutzer eingeloggt (numerische ID) +- `requireAdmin` – prüft zusätzlich `role === "admin"` +- Ban-Check: Gebannte Nutzer erhalten 403, Session wird zerstört +- Socket.io: Session wird bei jedem Ereignis neu geladen + +## Passwort-Sicherheit + +- Hashing: argon2 (memory-hard, resistent gegen Brute-Force) +- Klartext-Passwort wird niemals gespeichert oder zurückgegeben