feat: authLimiter on POST /login, GET /callback, POST /dev-login (10 req / 5 min)
This commit is contained in:
@@ -30,8 +30,7 @@ const mutationLimiter = rateLimit({
|
||||
message: { error: 'Слишком много запросов. Подождите минуту.' },
|
||||
});
|
||||
|
||||
// ── exportLimiter — для публичного GET /export ────────────────────────────────
|
||||
// /export не требует авторизации (ТЗ) — поэтому ограничиваем жёстче.
|
||||
// ── exportLimiter — для GET /export ──────────────────────────────────────────
|
||||
// 20 запросов в минуту достаточно для автоматической синхронизации
|
||||
// (nginx/firewall обычно опрашивают раз в несколько минут).
|
||||
const exportLimiter = rateLimit({
|
||||
@@ -42,4 +41,16 @@ const exportLimiter = rateLimit({
|
||||
message: 'Слишком много запросов к /export. Подождите минуту.',
|
||||
});
|
||||
|
||||
module.exports = { mutationLimiter, exportLimiter };
|
||||
// ── authLimiter — для POST /login, POST /dev-login, GET /callback ─────────────
|
||||
// Защита от брутфорса и нагрузки на Keycloak token endpoint.
|
||||
// 10 попыток в 5 минут с одного IP — достаточно для нормального пользования,
|
||||
// жёстко блокирует автоматические переборы.
|
||||
const authLimiter = rateLimit({
|
||||
windowMs: 5 * 60_000, // скользящее окно: 5 минут
|
||||
limit: 10, // не более 10 попыток входа за окно
|
||||
standardHeaders: 'draft-7',
|
||||
legacyHeaders: false,
|
||||
message: { error: 'Слишком много попыток входа. Попробуйте через 5 минут.' },
|
||||
});
|
||||
|
||||
module.exports = { mutationLimiter, exportLimiter, authLimiter };
|
||||
|
||||
Reference in New Issue
Block a user