Files
flimmer/.env.example
T
Florian Wilde c0579c6f61
CI / pruefen (pull_request) Canceled after 0s
Anmeldung per Passkey (WebAuthn)
Ein Passkey ist der dritte Weg in denselben Trichter: finishLogin() prueft die
Antwort und gibt die Kennung zurueck, der Endpunkt legt damit ueber
createSession() dieselbe Sitzung an wie bei Passwort und OIDC. Die
Sitzungsschicht bleibt unangetastet.

Die Trennung zwischen Pruefung und Sitzung ist Absicht: in passkeys.ts steht
nur WebAuthn, das Setzen von Cookie und Sitzungszeile gehoert zur HTTP-Schicht.

Die Challenge liegt in einem signierten, fuenf Minuten gueltigen httpOnly-
Cookie statt in einer Tabelle — das spart Schema und Aufraeumjob fuer alles,
was liegen bleibt, wenn jemand den Dialog abbricht.

Die RP ID kommt aus APP_URL, nicht aus dem Host-Header. Hinter einem Reverse
Proxy hinge sie sonst am falschen Namen, und ein Passkey ist fest an diesen
Namen gebunden. Ueber nacktes HTTP verschwindet die Verwaltung mit einem
Hinweis statt einen kryptischen Browserfehler zu zeigen.

Den letzten verbleibenden Anmeldeweg laesst sich nicht entfernen: wer kein
Passwort und keine OIDC-Verknuepfung hat, behaelt seinen letzten Passkey.

Die Bibliothek prueft den Signaturzaehler selbst und wirft dabei gewoehnliche
Error. Die werden jetzt uebersetzt, damit eine erwartete Ablehnung nicht als
unerwarteter Serverfehler im Log landet. Die eigene Zaehlerpruefung bleibt als
zusaetzliche Sicherung fuer den Fall, den die Bibliothek durchlaesst.

Geprueft mit virtuellem Authenticator gegen einen Produktionsbau: anlegen,
abmelden, Anmeldung allein per Passkey, Sitzungscookie gesetzt,
Challenge-Cookie verbraucht, Passwortweg unveraendert. Mit kuenstlich
hochgesetztem Zaehler wird die Anmeldung abgelehnt und der Zaehler bleibt
stehen. Dazu sieben Tests fuer Verwaltung, Rechte und die Aussperrsperre.

Refs #6
2026-09-02 07:04:45 +02:00

92 lines
3.6 KiB
Bash

# =============================================================================
# Flimmer — Beispielkonfiguration
#
# cp .env.example .env
#
# Alles, was Flimmer über die Außenwelt wissen muss, steht hier. Die Datei .env
# gehört NICHT ins Repository (siehe .gitignore).
# =============================================================================
# --- Datenbank ---------------------------------------------------------------
# Im Docker-Compose-Betrieb zeigt der Host auf den Dienst "db".
POSTGRES_USER=flimmer
POSTGRES_PASSWORD=bitte-aendern
POSTGRES_DB=flimmer
DATABASE_URL=postgresql://flimmer:bitte-aendern@db:5432/flimmer?schema=public
# --- Grundeinstellungen ------------------------------------------------------
# Öffentlich erreichbare Adresse der Instanz (ohne abschließenden Schrägstrich).
# Wird für Links in Benachrichtigungen und für OIDC-Rücksprünge gebraucht.
APP_URL=http://localhost:3000
APP_NAME=Flimmer
# Zufälliger Wert, mindestens 32 Zeichen. Erzeugen z. B. mit:
# node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
AUTH_SECRET=bitte-durch-zufallswert-ersetzen
# Ablage für Bild-Cache und sonstige Laufzeitdaten.
DATA_DIR=/app/data
# Port, auf dem Flimmer auf dem Host lauscht.
APP_PORT=3000
# Zeitzone für Kalender, Statistiken und geplante Läufe
TZ=Europe/Berlin
# --- Registrierung -----------------------------------------------------------
# Der erste registrierte Nutzer wird automatisch Admin. Danach lässt sich die
# Registrierung im Adminbereich abschalten; dieser Wert ist nur die Vorgabe
# für die allererste Inbetriebnahme.
ALLOW_REGISTRATION=true
# --- TMDB --------------------------------------------------------------------
# Kostenloser Schlüssel: https://www.themoviedb.org/settings/api
# Entweder der klassische API-Key (v3) …
TMDB_API_KEY=
# … oder das Bearer-Token (v4). Eines von beidem genügt.
TMDB_ACCESS_TOKEN=
# Sprache der Metadaten und Region für die Streaming-Verfügbarkeit
TMDB_LANGUAGE=de-DE
TMDB_REGION=DE
# Nur nötig, wenn TMDB über einen eigenen Proxy erreicht werden soll.
# TMDB_BASE_URL=https://api.themoviedb.org/3
# TMDB_IMAGE_BASE_URL=https://image.tmdb.org/t/p
# --- Hintergrundläufe --------------------------------------------------------
# Eingebauter Scheduler (prüft laufende Serien auf neue Episoden, räumt den
# Papierkorb, verschickt Benachrichtigungen). Bei mehreren App-Instanzen nur
# in einer aktivieren.
ENABLE_SCHEDULER=true
# Uhrzeit des täglichen Laufs (24-Stunden-Format)
SYNC_HOUR=4
# Alternativ von außen anstoßen: curl -H "Authorization: Bearer $CRON_SECRET" \
# https://flimmer.example/api/cron/sync
CRON_SECRET=
# --- E-Mail (optional) -------------------------------------------------------
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
SMTP_SECURE=false
SMTP_FROM=Flimmer <flimmer@example.com>
# --- Passkeys (WebAuthn) -----------------------------------------------------
# Anmeldung per Fingerabdruck, Gesicht oder Sicherheitsschlüssel. Standardmäßig an.
# Passkeys brauchen HTTPS — Ausnahme ist localhost. Sie sind fest an den
# Hostnamen aus APP_URL gebunden: nach einem Domainwechsel müssen alle
# Passkeys neu angelegt werden.
ENABLE_PASSKEYS=true
# --- OIDC / SSO (optional) ---------------------------------------------------
# Anbindung an Authelia, Keycloak, Authentik … Leer lassen = deaktiviert.
# Redirect-URI beim Anbieter eintragen: <APP_URL>/api/auth/oidc/callback
OIDC_ISSUER=
OIDC_CLIENT_ID=
OIDC_CLIENT_SECRET=
OIDC_SCOPES=openid profile email
# Beschriftung des Login-Knopfes
OIDC_BUTTON_LABEL=Mit SSO anmelden
# Neue Nutzer per OIDC automatisch anlegen
OIDC_AUTO_REGISTER=true