登录路线特快费率限制

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

我的目标是在 10 分钟内停工前 10 个轮胎。如果用户再次尝试并再次失败 5 次,则锁定时间将增加到 20 分钟。 20 分钟后,如果同一用户尝试 3 次失败,锁定时间为 1 小时,最后,1 小时后,如果同一用户再次出错,则会将其锁定 24 小时。

我怎么能这么做呢?我正在使用

express-rate-limit
并将其作为中间件传递

const rateLimit = require('express-rate-limit');

    const apiLimiter = rateLimit({
        windowMs: 10 * 60 * 1000,
        headers: true,
        max: 10,
    });
    
    module.exports = apiLimiter;

第一次尝试有效,但要进行下一次尝试。

node.js express handler rate-limiting express-rate-limit
1个回答
0
投票

这可以通过创建多个 Express-rate-limit 实例并将它们全部应用于每个请求来完成:

const rateLimit = require('express-rate-limit');

app.post('/login', 

    // 10 tires in 10 minutes
    rateLimit({
        windowMs: 10 * 60 * 1000,
        headers: false,
        max: 10,
    }),

    // 5 more try in 20 minutes
    rateLimit({
        windowMs: 20 * 60 * 1000,
        headers: false,
        max: 10 + 5,
    }),

    // 3 more tries in 1 hour
    rateLimit({
        windowMs: 60 * 60 * 1000,
        headers: false,
        max: 10 + 5 + 3,
    }),

    // 1 more try in 24 hours
    rateLimit({
        windowMs: 24 * 60 * 60 * 1000,
        headers: false,
        max: 10 + 5 + 3 + 1,
    }),

    function(req, res) {
        // handle login attempt here, if it passed all the rate limiters
    }
);

在这种情况下,正确处理标头可能很棘手,因此我选择在示例中禁用它们。

重要提示:如果您使用除内置默认内存存储之外的任何

store
,请务必为每个限制创建一个新实例,并为每个存储实例使用唯一的
prefix


披露:我是express-rate-limit的作者

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