feat(auth): Sitzungen laufen standardmaessig 7 Tage

JWT_EXPIRES_IN faellt ohne Eintrag in .env jetzt auf 7d statt 12h zurueck.
Doku und .env.example angepasst.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Sascha Wolf
2026-09-23 22:05:24 +02:00
co-authored by Claude Opus 5.5
parent 59b962d66b
commit e2ad8ab03e
7 changed files with 7 additions and 7 deletions
+1 -1
View File
@@ -69,7 +69,7 @@ sequenceDiagram
E->>M: SELECT crm_users WHERE username E->>M: SELECT crm_users WHERE username
M-->>E: Zeile mit bcrypt-Hash M-->>E: Zeile mit bcrypt-Hash
E->>E: bcrypt.compare E->>E: bcrypt.compare
E-->>B: { token (JWT, 12 h), user } E-->>B: { token (JWT, 7 Tage), user }
Note over B: Token im localStorage Note over B: Token im localStorage
B->>A: GET /api/scanner/matches<br/>Authorization: Bearer ... B->>A: GET /api/scanner/matches<br/>Authorization: Bearer ...
+1 -1
View File
@@ -51,7 +51,7 @@ mitten im Scrapen beenden.
| --- | --- | | --- | --- |
| `PORT`, `HOST` | `5006`, `127.0.0.1` - von außen nur über Apache | | `PORT`, `HOST` | `5006`, `127.0.0.1` - von außen nur über Apache |
| `DB_*` | Verbindung zu `perinco_CRM` | | `DB_*` | Verbindung zu `perinco_CRM` |
| `JWT_SECRET`, `JWT_EXPIRES_IN` | Signatur der Sitzungen, Standard 12 h | | `JWT_SECRET`, `JWT_EXPIRES_IN` | Signatur der Sitzungen, Standard 7 Tage (`7d`) |
| `ADMIN_*` | wird beim ersten Start angelegt, nur wenn `crm_users` leer ist | | `ADMIN_*` | wird beim ersten Start angelegt, nur wenn `crm_users` leer ist |
| `SCANNER_DB_NAME` | eigene Scanner-Datenbank, Standard `perinco_scanner` | | `SCANNER_DB_NAME` | eigene Scanner-Datenbank, Standard `perinco_scanner` |
| `SCANNER_ENCRYPTION_KEY` | AES-Schlüssel für Portal-Passwörter | | `SCANNER_ENCRYPTION_KEY` | AES-Schlüssel für Portal-Passwörter |
+1 -1
View File
@@ -1025,7 +1025,7 @@ nicht zum Benutzerkonto.
| Beobachtung | Ursache und Abhilfe | | Beobachtung | Ursache und Abhilfe |
| --- | --- | | --- | --- |
| „Sitzung abgelaufen" | 12 Stunden vorbei, neu anmelden | | „Sitzung abgelaufen" | 7 Tage seit der Anmeldung vorbei, neu anmelden |
| Trefferliste ist leer | *Anzeige ab %* zu hoch oder *Zeitraum* zu kurz | | Trefferliste ist leer | *Anzeige ab %* zu hoch oder *Zeitraum* zu kurz |
| Kein Ton bei Treffern | Dashboard offen? Einmal auf der Seite geklickt? Wert *Hinweis ab %* erreicht? | | Kein Ton bei Treffern | Dashboard offen? Einmal auf der Seite geklickt? Wert *Hinweis ab %* erreicht? |
| Mikrofon-Knopf fehlt | kein Mikrofon oder keine HTTPS-Verbindung | | Mikrofon-Knopf fehlt | kein Mikrofon oder keine HTTPS-Verbindung |
+1 -1
View File
@@ -65,7 +65,7 @@ im Quelltext steht kein Passwort.
| Export | Zweck | | Export | Zweck |
| --- | --- | | --- | --- |
| `signToken(user)` | JWT mit `sub` und `role`, Laufzeit aus `JWT_EXPIRES_IN` (12 h) | | `signToken(user)` | JWT mit `sub` und `role`, Laufzeit aus `JWT_EXPIRES_IN` (7 Tage) |
| `requireAuth` | Token prüfen **und** Benutzer frisch aus der DB laden | | `requireAuth` | Token prüfen **und** Benutzer frisch aus der DB laden |
| `requireAdmin` | 403, wenn `req.user.role !== 'admin'` | | `requireAdmin` | 403, wenn `req.user.role !== 'admin'` |
+1 -1
View File
@@ -13,7 +13,7 @@ daneben bestehen.
| App-Registrierung | dieselbe wie die [Postfachanbindung](11-postfach.md) - kein zweites Secret | | App-Registrierung | dieselbe wie die [Postfachanbindung](11-postfach.md) - kein zweites Secret |
| Neue Konten | **werden nicht angelegt**; es braucht ein bestehendes Konto in der Nutzerverwaltung | | Neue Konten | **werden nicht angelegt**; es braucht ein bestehendes Konto in der Nutzerverwaltung |
| Passwortanmeldung | bleibt für alle bestehen (Notzugang, falls Entra ausfällt) | | Passwortanmeldung | bleibt für alle bestehen (Notzugang, falls Entra ausfällt) |
| Sitzung | wie bisher ein CRM-JWT aus `signToken()`, Standard 12 h | | Sitzung | wie bisher ein CRM-JWT aus `signToken()`, Standard 7 Tage |
## Ablauf ## Ablauf
+1 -1
View File
@@ -14,7 +14,7 @@ DB_NAME=perinco_CRM
# Signiert die JWT-Sessions. Muss ein langer Zufallswert sein. # Signiert die JWT-Sessions. Muss ein langer Zufallswert sein.
JWT_SECRET=changeme-langer-zufallswert JWT_SECRET=changeme-langer-zufallswert
JWT_EXPIRES_IN=12h JWT_EXPIRES_IN=7d
# Wird beim ersten Start angelegt, falls noch kein Benutzer existiert. # Wird beim ersten Start angelegt, falls noch kein Benutzer existiert.
ADMIN_USERNAME=admin ADMIN_USERNAME=admin
+1 -1
View File
@@ -11,7 +11,7 @@ function secret() {
export function signToken(user) { export function signToken(user) {
return jwt.sign({ sub: user.id, role: user.role }, secret(), { return jwt.sign({ sub: user.id, role: user.role }, secret(), {
expiresIn: process.env.JWT_EXPIRES_IN || '12h', expiresIn: process.env.JWT_EXPIRES_IN || '7d',
}); });
} }