fcf4ecc324
Die drei letzten wichtigen Features für ein produktionsreifes 1.0.0: ## 1. Passwort vergessen-Flow Der klassische Selfservice-Reset per Email – sowohl für Mitarbeiter als auch für Portal-Kunden. User können sich nicht mehr aussperren, Admin muss nicht mehr manuell eingreifen. - Neues Link "Passwort vergessen?" auf Login-Seite - PasswordResetRequest: Email + Typ-Auswahl (Mitarbeiter / Portal) - PasswordResetConfirm: Token-basierte Bestätigung + neues Passwort (min 6 Zeichen) - Token ist 2 Stunden gültig, dann muss neu angefordert werden - Token ist kryptografisch sicher (crypto.randomBytes(32)) - User-Enumeration-Schutz: Backend gibt immer 200 zurück, egal ob Email existiert - Nach erfolgreichem Reset werden ALLE bestehenden Sessions gekickt (tokenInvalidatedAt gesetzt) – falls jemand parallel eingeloggt war DB: - User.passwordResetToken + passwordResetExpiresAt - Customer.portalPasswordResetToken + portalPasswordResetExpiresAt ## 2. Rate-Limiting gegen Brute-Force Mit express-rate-limit: - Login: 10 Versuche pro 15 Minuten pro IP. Erfolgreiche zählen nicht mit. - Passwort-Reset-Request: 5 Versuche pro Stunde pro IP (Mail-Flut verhindern) Sowohl Mitarbeiter-Login als auch Portal-Login geschützt. ## 3. Auto-Geburtstagsgrüße per Cron Das autoBirthdayGreeting-Flag hatten wir schon, aber kein Scheduler der ihn wirklich abschickt. Jetzt: - Läuft täglich um 08:00 Uhr - Findet Kunden mit heutigem Geburtstag + autoBirthdayGreeting=true - Nur Email-Kanal (Messenger brauchen Browser-Klick) - Catch-up 30s nach Server-Start: wenn Server am Geburtstag down war, wird beim nächsten Boot nachgeholt - lastBirthdayGreetingYear verhindert Doppelversand Dependencies: node-cron, @types/node-cron, express-rate-limit Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
/**
|
|
* Rate-Limiting-Middleware für sensible Endpoints (Login, Passwort-Reset).
|
|
* Schützt gegen Brute-Force- und Credential-Stuffing-Angriffe.
|
|
*/
|
|
import rateLimit from 'express-rate-limit';
|
|
|
|
/**
|
|
* Login: 10 Versuche pro 15 Minuten pro IP.
|
|
* Nach Überschreitung: 15 Min Sperre für diese IP.
|
|
*/
|
|
export const loginRateLimiter = rateLimit({
|
|
windowMs: 15 * 60 * 1000, // 15 Minuten
|
|
limit: 10, // Max. 10 Versuche pro Zeitfenster
|
|
standardHeaders: 'draft-7',
|
|
legacyHeaders: false,
|
|
message: {
|
|
success: false,
|
|
error: 'Zu viele Login-Versuche. Bitte in 15 Minuten erneut versuchen.',
|
|
},
|
|
// Erfolgreiche Logins zählen nicht gegen das Limit
|
|
skipSuccessfulRequests: true,
|
|
});
|
|
|
|
/**
|
|
* Passwort-Reset-Anfrage: 5 Versuche pro Stunde pro IP.
|
|
* Verhindert Mail-Flut und gezielte Brute-Force über Reset-Links.
|
|
*/
|
|
export const passwordResetRateLimiter = rateLimit({
|
|
windowMs: 60 * 60 * 1000, // 1 Stunde
|
|
limit: 5,
|
|
standardHeaders: 'draft-7',
|
|
legacyHeaders: false,
|
|
message: {
|
|
success: false,
|
|
error: 'Zu viele Passwort-Reset-Anfragen. Bitte in einer Stunde erneut versuchen.',
|
|
},
|
|
});
|