/** * Общая фабрика rate-limit'ов. * * Зачем: у каждого роута был свой keyGenerator по req.ip, из-за чего * express-rate-limit при старте сыпал ERR_ERL_KEY_GEN_IPV6 (IPv6-клиент мог обойти лимит), * а лимиты применялись в том числе к администратору. */ const { rateLimit, ipKeyGenerator } = require('express-rate-limit'); function isAdmin(req) { return !!(req.session && req.session.user && req.session.user.role === 'admin'); } // Ключ: залогиненный — по пользователю, гость — по IP (через хелпер, он корректно // сворачивает IPv6 в /64-подсеть). function keyGenerator(req) { const id = req.session && req.session.user && req.session.user.id; return id ? 'user_' + id : ipKeyGenerator(req.ip); } // Админ не ограничивается ничем: skipAdmin: false — только там, где лимит защищает // не сервис, а самого пользователя (например, брутфорс логина). function createLimiter({ windowMs = 60000, max = 30, message = { error: 'Слишком много запросов' }, skipAdmin = true } = {}) { return rateLimit({ windowMs, max, message, standardHeaders: true, legacyHeaders: false, keyGenerator, skip: skipAdmin ? isAdmin : () => false, }); } module.exports = { createLimiter, isAdmin, keyGenerator };