Passwort-Reset per Einmal-Link (kver reset-link)
Ohne E-Mail-System erzeugt der Admin per CLI einen Link (/reset#<token>), gültig 72 h und einmal. Gespeichert wird nur der SHA-256 des Tokens; es steht im Fragment und geht nur im POST-Body an die API. Der Reset meldet alle alten Sessions ab und loggt direkt neu ein. Passwortregeln jetzt gemeinsam in checkNewPassword. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
b6cf8c7fa0
commit
81a74375b7
+8
-1
@@ -42,7 +42,7 @@ Endpunkte antworten ohne gültige Session mit `401 auth.required`.
|
||||
**CSRF:** Nicht-GET-Requests mit fremdem `Origin`-Header werden mit
|
||||
`403 csrf.bad_origin` abgewiesen.
|
||||
|
||||
**Rate-Limits** (pro IP): Login und Registrierung 20/min.
|
||||
**Rate-Limits** (pro IP): Login, Registrierung und Passwort-Reset 20/min.
|
||||
|
||||
---
|
||||
|
||||
@@ -54,10 +54,17 @@ Endpunkte antworten ohne gültige Session mit `401 auth.required`.
|
||||
| POST | `/api/auth/newuser` | – | `user` (3–32 Zeichen), `pass1` (min. 10), `pass2` | `201 {"username"}` |
|
||||
| POST | `/api/auth/logout` | – | – | `200 {"status":"ok"}`, löscht Cookie |
|
||||
| GET | `/api/auth/sessioninfo` | ✓ | – | `200 {"uid","created_at","expires","description"}`, ohne Session `401` |
|
||||
| POST | `/api/auth/reset/check` | – | `token` | `200 {"username"}`; ungültig/abgelaufen/benutzt: `404 reset.invalid` |
|
||||
| POST | `/api/auth/reset` | – | `token`, `pass1` (min. 10), `pass2` | `200 {"username"}` + Cookie (eingeloggt); löscht alle alten Sessions, Link verbraucht |
|
||||
|
||||
Login-Fehler: `401 auth.bad_credentials` (gleich für unbekannten Nutzer und
|
||||
falsches Passwort).
|
||||
|
||||
Reset-Links erzeugt nur der Admin per CLI (`kver reset-link <nutzername>`,
|
||||
siehe deploy.md). Sie zeigen auf `/reset#<token>`, gelten 72 h und einmal; ein
|
||||
neuer Link macht ältere desselben Nutzers ungültig. Das Token steht im
|
||||
Fragment und geht nur im POST-Body an die API, damit es nicht in Logs landet.
|
||||
|
||||
---
|
||||
|
||||
## Beiträge
|
||||
|
||||
@@ -63,6 +63,7 @@ Konfiguration über Umgebungsvariablen:
|
||||
| `KVER_ADDR` | `:8080` | Listen-Adresse im Container |
|
||||
| `KVER_DSN` | _(Pflicht)_ | Postgres-Verbindung, z. B. `postgres://kver:pw@host:5432/kontrollverlust?sslmode=disable` |
|
||||
| `KVER_GEOIP_ASN` | _(leer)_ | Pfad zur GeoLite2-ASN-`.mmdb`; leer = ASN-Auflösung aus |
|
||||
| `KVER_BASE_URL` | _(leer)_ | Öffentliche Adresse für `kver reset-link`; leer = nur Pfad |
|
||||
|
||||
## GeoLite2-ASN-Datenbank (optional)
|
||||
|
||||
@@ -217,3 +218,16 @@ systemctl --user restart kver
|
||||
|
||||
Die App fährt bei SIGTERM sauber herunter (laufende Requests werden zu Ende
|
||||
bedient, dann wird die DB-Verbindung geschlossen).
|
||||
|
||||
## Passwort zurücksetzen
|
||||
|
||||
Ohne E-Mail-System erzeugt der Admin einen Einmal-Link und gibt ihn dem
|
||||
Nutzer persönlich:
|
||||
|
||||
```sh
|
||||
podman exec kver kver reset-link <nutzername>
|
||||
```
|
||||
|
||||
Der Link (`/reset#<token>`) gilt 72 Stunden und nur einmal; ein neuer Link
|
||||
macht ältere desselben Nutzers ungültig. Beim Setzen des neuen Passworts
|
||||
werden alle bestehenden Sessions des Nutzers abgemeldet.
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
# TODO
|
||||
|
||||
- Moderation (Melden, Queue, Abhilfe) als eigenständiges Projekt
|
||||
- Passwort-Reset
|
||||
- Passwort ändern im Profil; Reset per E-Mail (bisher nur Admin-Link, `kver reset-link`)
|
||||
- Suche
|
||||
- Hashtags / Erwähnungen
|
||||
- Block / Mute
|
||||
|
||||
Reference in New Issue
Block a user