节点 js 速率限制

Node js Rate Limit

我正在尝试使用 express-rate-limit 在我的应用程序上设置 API 速率限制。如果它来自相同的 IP 地址,它就可以工作。一旦达到最大值 5,我就会收到一条错误消息。但是,当从不同的 IP address/computer 尝试时,它会失败。知道我该如何解决这个问题吗?我尝试使用 127.0.0.1 来生成一个密钥,不管是哪个 IP 地址,但也失败了。

下面是我的代码:

// Rate Limit
var RateLimit = require('express-rate-limit');

app.enable('trust proxy');

var limiter = new RateLimit({
  windowMs: 365*24*60*60*1000, // 1 year
  max: 5, // limit each IP to 1 requests per windowMs
  delayMs: 365*24*60*60*1000, // delaying - 365 days until the max limit is reached
  message: "Sorry, the maximum limit of 50 letters sent has been reached. Thank you for participating!",
  keyGenerator: function (req) {
    req.ip = "127.0.0.1";
    // req.ip = "ip address";
    return req.ip;
  }
});

app.use('/api/letter', limiter); 

express-rate-limit 使用的内存存储实现使用 setTimeout()windowMs 毫秒后清除存储。

根据 Node.js documentation for setTimeout(),

When delay is larger than 2147483647 or less than 1, the delay will be set to 1.

在您的情况下,延迟大于该数量,即 31536000000 毫秒。这导致存储永远不会存储超过 1 毫秒的任何数据。

要解决这个问题,您可能必须实现自己的商店(请参阅 store 选项),或者寻找没有此限制的替代速率限制器(在我看来如此长的到期时间,无论如何你都需要某种持久存储)。

我觉得叫这个"rate limiting"是完全合理的。仅仅因为时间段很大(每年)并不意味着它不是每个时间段的限制。

https://www.ratelim.it/documentation/once_and_only_once 更进一步,让你每个 "infinite" 做 N 次,这非常有用。

您应该可以使用这项服务每年做 5 次。 (我运行ratelim.it)。

rate-limiter-flexible 包含 Mongo 的软件包可以帮助设置 1 年的速率限制

const { RateLimiterMongo } = require('rate-limiter-flexible');
const { MongoClient } = require('mongodb');

const mongoOpts = {
  useNewUrlParser: true,
  reconnectTries: Number.MAX_VALUE, // Never stop trying to reconnect
  reconnectInterval: 100, // Reconnect every 100ms
};

const mongoConn = MongoClient.connect(
  'mongodb://localhost:27017',
  mongoOpts
);

const opts = {
  mongo: mongoConn,
  points: 5, // Number of points
  duration: 365*24*60*60, // Per 1 year
};

const rateLimiter = new RateLimiterMongo(opts);

app.use('/api/letter', (req, res, next) => {
  rateLimiter.consume(req.ip)
    .then(() => {
      next();
    })
    .catch((rejRes) => {
      res.status(429).send('Too Many Requests');
  });
);

还建议设置insuranceLimiter和屏蔽策略。阅读更多 here