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:
co-authored by
Claude Opus 5.5
parent
59b962d66b
commit
e2ad8ab03e
@@ -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
@@ -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 |
|
||||||
|
|||||||
@@ -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 |
|
||||||
|
|||||||
@@ -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'` |
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user