【问题标题】:Fastify-rate-limit for multiple API's with regards to IP关于 IP 的多个 API 的 Fastify-rate-limit
【发布时间】:2021-09-01 21:40:42
【问题描述】:

我想实现一个 api 速率限制器,我正在使用 fastify-rate-limit。

我可以限制请求。但它适用于所有请求。

我想要相同的限制,但每个 API 的计数应该是分开的,我不知道该怎么做。 我在 server.js 中使用这个 sn-p

 fastify.register(require('fastify-rate-limit'),
{
  max: 20, 
  timeWindow: 1000*30,
});

你可以看看 fastify-rate-limit 文档

https://github.com/fastify/fastify-rate-limit

【问题讨论】:

  • the docs 有什么不清楚的地方?

标签: rate-limiting fastify


【解决方案1】:

在文档(https://github.com/fastify/fastify-rate-limit)中,您会发现 fastify.register(require('fastify-rate-limit') 中有不同的属性,例如 ,max,timeWindow,global 等)

 fastify.register(require('fastify-rate-limit'), {
  global : false,                            // default true
  max: 3,                                    // default 1000
  ban: 2,                                    // default null
  timeWindow: 5000,                          // default 1000 * 60
  cache: 10000,                              // default 5000
  allowList: ['127.0.0.1'],                  // default []
  redis: new Redis({ host: '127.0.0.1' }),   // default null
  skipOnError: true,                         // default false
  keyGenerator: function(req) { /* ... */ }, // default (req) => req.raw.ip
  errorResponseBuilder: function(req, context) { /* ... */},
  enableDraftSpec: true, // default false. Uses IEFT draft header standard
  addHeaders: { 
  // default show all the response headers when rate limit is reached
    'x-ratelimit-limit': true,
    'x-ratelimit-remaining': true,
    'x-ratelimit-reset': true,
    'retry-after': true
  }
})

keyGenerator 属性是我需要修改以达到我想要的结果。 keyGenerator 生成一个密钥,然后用于唯一标识请求默认是最终用户的 IP 地址,但您可以更改它。 您可以使用请求对象的不同属性来修改此keyGenerator。

在我的例子中,我想通过 api 和 IP 地址唯一地识别一个请求。所以我根据IP地址和API名称生成了一个密钥,使用请求对象的两个属性如下所示。

req.raw.ip
req.raw.url

下面可以看到我为实现所需而编写的完整 sn-p。

fastify.register(require('fastify-rate-limit'),
{
  keyGenerator (req) { 
    let requestUrl = req.raw.url;
    requestUrl = requestUrl.split('/');
    let apiName = requestUrl[requestUrl.length - 1].replace('/','');
    return req.raw.ip+apiName },
  max: 20,
  timeWindow: 1000*30,
});

希望这对您有所帮助。

【讨论】:

    【解决方案2】:

    要解决这个问题,首先要全局禁用fastify-rate-limit 像这样。

     fastify.register(require('fastify-rate-limit'),
       {
         global : false, ​
         max: 20, 
        timeWindow: 1000*30,
      });
    

    然后在您要添加限制的每个端点上,您可以通过添加这些选项对象来实现,如下所示

    fastify.get('/', {
      config: {
        rateLimit: {
          max: 20,
          timeWindow:  1000*30
        }
      }
    }, (req, reply) => {
      reply.send({ Hello: 'World' })
    })
    

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      相关资源
      最近更新 更多