【发布时间】:2018-06-08 22:28:08
【问题描述】:
我正在尝试使用 express-rate-limit 在我的应用程序上设置 API 速率限制。如果它来自相同的 IP 地址,它就可以工作。一旦达到最大值 5,我就会收到一条错误消息。但是,当它从不同的 IP 地址/计算机尝试时,它会失败。知道如何解决这个问题吗?我尝试使用 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);
【问题讨论】:
-
这看起来很奇怪。您想将某人限制为每年 5 次请求?抱歉,但这与速率限制无关。那是另一回事。这就是为什么您找不到速率限制器来执行此操作的原因。速率限制通常是将某人限制为每分钟 5 个请求。看来您只是想限制有多少人可以使用您的服务。如果是这种情况,那么您只需要保留某种会话使用计数器,您可以为每个用户持久存储并检查每个操作。这不是速率限制。
-
而且,要在长达一年的时间内强制执行某些操作,您还必须使用持久存储,这将再次排除速率限制选项。
-
而且,您必须使用某种持久的用户 ID(通过登录验证)作为密钥。
-
我正在使用第 3 方供应商,每次成功通话向我收取 0.95 美元的费用。它使写信自动化。我正在建立一项服务,允许人们给当地代表写一封信,我在一定程度上资助了这封信。我不想堆积账单。其次,我没有资源来构建数据库和管理用户信息。因此,速率限制。
-
你不会找到一个可以工作一年的速率限制模块。你不会的。因为您的服务器不太可能在一年之内永远不会重新启动,所以您必须对操作进行持久存储。而且,您还必须通过一些持久的用户 ID 来跟踪它们。这些是满足您的需求的要求。这不是速率限制的作用。您在错误的池塘中寻找解决方案。而且,您还需要持久的用户 ID 来可靠地跟踪这一点(某种登录系统),因此您也必须具有持久性。
标签: javascript node.js api rate-limiting