Используя обратный вызов onLimitReached
, вы можете вести учет времени, когда IP-адрес снова разблокируется. Затем вы можете написать другое промежуточное программное обеспечение, которое проверяет, когда достигнута дата разблокировки.
В приведенном ниже примере bannedIPs
ведет запись времени, когда IP-адрес снова разблокируется, а banner
- это промежуточное ПО, которое использует время для блокировки IP-адреса в соответствии с текущей датой.
...
var express = require('express');
var app = express();
const RateLimit = require('express-rate-limit');
const RedisStore = require('rate-limit-redis');
// Keep the IPs that are banned
const bannedIPs = {};
limiter = new RateLimit({
store: new RedisStore({
expiry: 60
}),
onLimitReached: function(req, res, options) {
// The IP will be unblocked again in an hour (60*60*1000)
bannedIPs[req.ip] = +new Date() + 60*60*1000;
},
max: 120
});
banner = function(req, res, next) {
// If the current Date is still before than the unblocking date,
// send a 429 message indicating too many requests
if (bannedIPs[req.ip] >= +new Date()) {
res.status(429).send("Sorry, too many requests: " + new Date(bannedIPs[req.ip]));
} else {
next();
}
}
app.use(banner);
app.use(limiter);
...
Существует много возможностей для улучшения, например, удаление IP-адресов, когда они больше не блокируются, и, возможно, хранение ключей в Redis, чтобы они были постоянными после перезапуска сервера. Но это даст вам отправную точку.