Auth & Benutzer
Inhalt
ITSWEBER Play verwendet Better Auth als Authentifizierungs-Framework. Das System unterstützt E-Mail/Passwort als primären Anmelde-Mechanismus und ist für zukünftige OIDC- und WebAuthn-Integration vorbereitet.
Authentifizierungsanbieter
| Anbieter | Status | Hinweise |
|---|---|---|
| E-Mail/Passwort | Verfügbar | Standard; Passwort-Reset per E-Mail |
| OIDC (Authentik, Keycloak) | Geplant v1.0 | Vorbereitet, noch nicht implementiert |
| Passkey/WebAuthn | Geplant v1.0 | Vorbereitet, noch nicht implementiert |
| Social OAuth | Nicht geplant | Kein Fahrplan vorgesehen |
Benutzerrollen
| Rolle | Kurzbezeichnung | Berechtigungen |
|---|---|---|
| Admin | Vollzugriff | Alle Bereiche der Plattform, Admin-Panel, Theme, Legal, Einstellungen |
| Moderator | Inhaltsmoderation | Alle Inhalte einsehen, Videos/Kommentare ausblenden oder löschen, Meldungen verwalten |
| Creator | Inhaltserstellung | Eigene Kanäle und Videos hochladen, bearbeiten und verwalten |
| Viewer | Nur Konsum | Öffentliche und nicht gelistete Videos ansehen; Kommentieren, sofern aktiviert |
Rollen werden im Admin-Panel unter /admin/users pro Nutzer zugewiesen und können jederzeit geändert werden.
Admin-Bootstrap
Beim ersten Start der Instanz existiert noch kein Admin-Konto. Das Bootstrap-Verfahren läuft automatisch über die Umgebungsvariable:
INITIAL_ADMIN_EMAIL=admin@example.com
Der erste Benutzer, der sich mit exakt dieser E-Mail-Adresse registriert, erhält automatisch die Admin-Rolle. Anschließend kann diese Variable entfernt werden — sie wird nur einmalig ausgewertet.
Die Implementierung befindet sich in apps/api/src/auth.ts.
Session-Verwaltung
Sessions werden als sichere HTTP-Only-Cookies verwaltet:
| Eigenschaft | Wert |
|---|---|
| Cookie-Typ | HTTP-Only (kein JavaScript-Zugriff) |
| SameSite | Lax |
| Secure | Aktiviert in Produktion (HTTPS) |
| Session-Dauer | 30 Tage (verlängerbar durch Aktivität) |
Sessions werden server-seitig in der Datenbank gespeichert. Ein expliziter Logout macht die Session sofort ungültig.
Sichtbarkeits-Durchsetzung
Die Funktion canViewVideo() wird zentral an allen Lese-Endpunkten ausgewertet. Sie bestimmt, wer welches Video sehen darf:
| Sichtbarkeit | Zugriff | Erscheint in Feeds |
|---|---|---|
public |
Jeder (auch nicht angemeldete Besucher) | Ja |
unlisted |
Nur über direkten Link erreichbar | Nein |
logged_in |
Nur angemeldete Nutzer | Ja (für eingeloggte Nutzer) |
private |
Nur Eigentümer und Admins | Nein |
Nicht autorisierte Zugriffe auf private- und logged_in-Videos geben HTTP 403 zurück. Signierte MinIO-URLs für Mediendateien verfallen nach 1 Stunde.
Rate-Limiting
| Endpunkt | Limit | Fenster |
|---|---|---|
| Global (alle Anfragen) | 60 Anfragen | pro IP / Minute |
| Datei-Upload | 5 parallele Uploads | pro angemeldetem Nutzer |
| Registrierung | 3 Versuche | pro IP / Stunde |
| Login (fehlgeschlagen) | 10 Versuche | pro IP / 15 Minuten |
Rate-Limits werden über Redis implementiert und gelten auch hinter einem Reverse Proxy, sofern der Header X-Forwarded-For korrekt weitergeleitet wird.
Registrierungskontrolle
Admins können die öffentliche Registrierung im Admin-Panel unter /admin/settings deaktivieren. In diesem Einladungs-Modus können nur Admins neue Nutzerkonten anlegen.
Einstellung: REGISTRATION_ENABLED (Umgebungsvariable) oder toggle im Admin-Panel (überschreibt die ENV).
© Benjamin Weber · ITSWEBER — play.itsweber.net · GitHub