feat: rate limiting connexion (5 essais / 15 min)
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
const MAX_ATTEMPTS = 5
|
||||
const BLOCK_DURATION_MS = 15 * 60 * 1000 // 15 minutes
|
||||
|
||||
type Entry = { count: number; blockedAt: number | null }
|
||||
let attempts = new Map<string, Entry>()
|
||||
|
||||
export function checkRateLimit(key: string): boolean {
|
||||
const now = Date.now()
|
||||
const entry = attempts.get(key)
|
||||
if (!entry) return true
|
||||
if (entry.blockedAt !== null) {
|
||||
if (now - entry.blockedAt < BLOCK_DURATION_MS) return false
|
||||
attempts.delete(key)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
export function recordFailedAttempt(key: string): void {
|
||||
const entry = attempts.get(key) ?? { count: 0, blockedAt: null }
|
||||
entry.count += 1
|
||||
if (entry.count >= MAX_ATTEMPTS) entry.blockedAt = Date.now()
|
||||
attempts.set(key, entry)
|
||||
}
|
||||
|
||||
export function clearAttempts(key: string): void {
|
||||
attempts.delete(key)
|
||||
}
|
||||
|
||||
/** Réinitialisation pour les tests uniquement */
|
||||
export function _resetForTests(): void {
|
||||
attempts = new Map()
|
||||
}
|
||||
Reference in New Issue
Block a user