我有以下问题。我在 DigitalOcean 上部署了两个应用程序,
API
(使用 Nodejs 和 express)和 CLIENT
(create-react-app)。
我想添加一个 api 调用速率限制器。我试过使用 express-rate-limiter
但是,如果我理解正确,它会阻止使用 CLIENT
应用程序 IP 的请求,因此当它达到允许的最大 api 调用时,express-rate-limiter
会阻止所有请求。这是我的速率限制器中间件
import rateLimit from "express-rate-limit";
const apiCallRateLimiter = rateLimit({
windowMs: 60 * 60 * 1000,
max: 1,
message: "You have reached maximum retries. Please try again later",
statusCode: 429,
headers: true,
});
app.use(apiCallRateLimiter);
app.use("/", router);
我试过这个 express-rate-limit 阻止所有用户的请求,但它没有用。中间件看起来像这样
import rateLimit from "express-rate-limit";
import { mw } from "request-ip";
const apiCallRateLimiter = rateLimit({
windowMs: 60 * 60 * 1000,
max: 1,
message: "You have reached maximum retries. Please try again later",
statusCode: 429,
headers: true,
keyGenerator: (req, res) => req.clientIp
});
app.use(mw());
app.use(apiCallRateLimiter);
app.use("/", router);
如何限制使用用户 IP 而不是我的
CLIENT
应用程序 IP 的 api 调用?提前致谢
我刚刚将
keyGenerator
处的箭头函数更改为匿名函数,现在可以使用了
const apiCallRateLimiter = rateLimit({
windowMs: 60 * 60 * 1000,
max: 1,
message: "You have reached maximum retries. Please try again later",
statusCode: 429,
headers: true,
keyGenerator(req) {
return req.clientIp;
},
});
试试这个:
app.set('trust proxy', 1);
通常你的网络和 api 网络应该是这样的:
所以,如果你没有正确配置,到达你的api的默认IP是直接消费者的IP:WEB服务器
因此对于这种情况,中介(示例中的 NGINX)发送一个名为 x-forwarded-for 的新标头以及原始消费者 ip。
express-rate-limit从Express提供的Request类获取ip:https://github.com/express-rate-limit/express-rate-limit/blob/master/source/lib .ts#L139
而express知道这一点并允许我们配置它以获取源ip:https://www.npmjs.com/package/express-rate-limit
app.set('trust proxy', 1);
还要检查这个: https://github.com/express-rate-limit/express-rate-limit/issues/165#issuecomment-548079359
如果您使用更复杂的网络层,请查看官方文档https://www.npmjs.com/package/express-rate-limit或实施您自己的速率限制