Node.js HTTP, как сделать ограничение скорости HTTP-запроса? - PullRequest
0 голосов
/ 10 сентября 2018

Я хочу создать промежуточное программное обеспечение ограничения скорости для моей экспресс-обработки http, что-то вроде этого:

app.post("/v1/authentication/login", rateLimiter(5, 20), require('./api/v1-login'));

Что промежуточное программное обеспечение будет разрешать только 5 запросов в течение 20 секунд.

Я могу использовать плагин для этого, но я также работаю с кластерами / процессами, и я прочитал, что плагин не будет поддерживать процессы.

Я знаю, что могу обмениваться данными между процессами, используя БД - MongoDB или Redis.

Кроме того, я хотел бы установить пользовательское ограничение скорости - это означает, что для функции A я хочу, чтобы пользователю John разрешалось запрашивать 5 раз в каждые 20 секунд, например, однако для той же функции я хочу, чтобы Дэни было разрешено отправлять 10 запросов в 20 секунд.

Мне также нужно, чтобы это применялось во всех процессах, как я упоминал ранее.

Я думал о написании собственного сценария сохранения данных запрашивающего пользователя, но я не знаю, что именно сохранить - его IP? его хромовый серийный номер или какой нибудь еще ..?

Должен ли я хранить это в Redis DB или Mongo? Может быть, в памяти встроен Node.js, который лучше хранить там вместо данных?

Что вы рекомендуете?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Нет ничего плохого в использовании плагина. Возьмите express-rate-limit с Redis Store , например, вы можете ограничить все приложение для IP-адреса пользователя и сохранить его в Redis:

const rateLimit = require("express-rate-limit");
const RedisStore = require('rate-limit-redis');
app.use(rateLimit({
  store: new RedisStore({ /* ... config */ });
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100 // limit each IP to 100 requests per windowMs
});

Или вы можете ограничить только данную конечную точку:

const someApiLimiter = rateLimit({
  windowMs: 5 * 60 * 1000,
  max: 12,
});
app.use('/api/some', someApiLimiter);

По умолчанию используется req.ip, но вы можете предоставить функцию keyGenerator и использовать что-то вроде, скажем, комбинации req.ip и req.user._id. Таким образом, вы покрыты на всех основах.

Я рекомендую Redis для этих вещей, так как вам нужно много небольших данных, Redis делает эти вещи хорошо.

0 голосов
/ 11 января 2019

Rate-Limit-Flexible- позволяет устанавливать различные ограничения для разных пользователей.

Работает в кластере без БД, MongoDB или Redis.

Подробнее о защите конечных точек входа в систему здесь Защита конечных точек входа в систему здесь

0 голосов
/ 10 сентября 2018

Я бы порекомендовал реализовать аутентификацию на основе токенов, очень похожую на API Facebook. Таким образом, вы можете отслеживать, кто использует API, и идентифицировать каждого пользователя.

Когда это будет реализовано, вы можете начать ограничивать количество вызовов в зависимости от пользователя (того, кто владеет токеном), который вызывает API в тот период времени, который вам нравится.

...