我想为我的快速http处理创建一个限速中间件,如下所示:
app.post("/v1/authentication/login", rateLimiter(5, 20), require('./api/v1-login'));
哪个中间件在20秒内仅允许5个请求。
我可以为此使用插件,但是我也正在使用集群/进程,并且我已经阅读到该插件不支持进程。
我知道我可以使用数据库-MongoDB或Redis在进程之间共享数据。
此外,我想设置一个自定义的速率限制-例如,对于功能A,我希望允许用户John每20秒请求5次, 但是,对于相同的功能,我希望允许Dani每20秒发送10个请求。
我还需要将它应用于我之前提到的所有过程中。
我考虑过编写自己的脚本来保存请求用户的数据,但是我不知道该保存什么-他的IP?他的Chrome序列号或以前的序列号..?
我应该将其存储在Redis DB或Mongo中吗? 也许有一个内置在内存中的Node.js更好地代替了保存数据?
您推荐什么?
答案 0 :(得分:1)
使用插件没有错。以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可以很好地完成这些事情。
答案 1 :(得分:0)
我建议像Facebook的API一样实现基于令牌的身份验证。这样,您可以监视谁在使用API,并识别每个用户。
实施该操作后,您可以根据喜欢的时间段内正在调用API的用户(拥有令牌的用户)开始限制调用。
答案 2 :(得分:0)
rate-limiter-flexible可以为不同的用户设置不同的限制。
它可以在没有任何DB,MongoDB或Redis的Cluster中工作。
上了解有关登录端点保护的信息。