Getting "ForbiddenError: invalid csrf token" when splitting routes into different files/modules

Getting "ForbiddenError: invalid csrf token" when splitting routes into different files/modules

我正在使用 csurf in my express 项目。我有 3 个文件:

这是使用 express application generator 时的标准样板。

我有一条路线在index.js:

router.get('/', csrfProtection, function(req, res, next) {
  res.render('index', {
      csrfToken: req.csrfToken()
  });
});

此路由的页面包含一个表单,该表单的隐藏字段带有 csrf 令牌:

input(name='_csrf', type='hidden', value='#{csrfToken}')

一切正常,我可以在源代码中看到 csrf 令牌。

提交表单后,它会在 routes/users.js:

中购买路由
router.post('/login', csrfProtection, function(req, resp) {
    if(!validator.isAlphanumeric(req.username))
        console.log('Not alphanumeric');

    ...
});

问题似乎与两个文件都必须创建 csrfcsrfToken 的新实例有关。在两个路由文件的开头,我都这样要求它们:

var csrf = require('csurf');
var csrfProtection = csrf({ cookie: true });

如果我将登录路由放入 routes/index.js 它工作正常,这让我觉得也许两个实例都使用不同的 csrf 令牌。

有什么想法吗?

是的,我相信它使用了不同的 CSRF 令牌。我通过在我的子模块中定义一个 init 函数,然后将 CSRF 令牌传递给它来解决这个问题。这样 CSRF 令牌只会创建一次。我认为在 app.js 中创建 CSRF 令牌可能是最好的,然后你可以将它传递到你的各个子模块中。

例如:

在users.js中:

function init(router, csrfProtection) {
    router.post('/login', csrfProtection, function(req, resp) {
        if(!validator.isAlphanumeric(req.username))
            console.log('Not alphanumeric');
        ...
    });
}

module.exports.init = init;

在app.js中:

...initialize router and CSRF protection...

var users = require('./users.js');
users.init(router, csrfProtection);