express-rate-limit 块请求由我的客户端应用程序 IP 而不是用户 IP

问题描述 投票:0回答:2

我有以下问题。我在 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 调用?提前致谢

javascript node.js express middleware rate-limiting
2个回答
0
投票

我刚刚将

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;
  },
});

-1
投票

快回答

试试这个:

app.set('trust proxy', 1);

说明

通常你的网络和 api 网络应该是这样的:

所以,如果你没有正确配置,到达你的api的默认IP是直接消费者的IPWEB服务器

x-forwarded-for 标题

因此对于这种情况,中介(示例中的 NGINX)发送一个名为 x-forwarded-for 的新标头以及原始消费者 ip。

express-rate-limitExpress提供的Request类获取ip:https://github.com/express-rate-limit/express-rate-limit/blob/master/source/lib .ts#L139

express知道这一点并允许我们配置它以获取源iphttps://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或实施您自己的速率限制

© www.soinside.com 2019 - 2024. All rights reserved.