gpt4 book ai didi

node.js - 将路由拆分到不同的文件/模块时获取 "ForbiddenError: invalid csrf token"

转载 作者:太空宇宙 更新时间:2023-11-03 22:12:42 42 4
gpt4 key购买 nike

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

  • app.js - 主入口点
  • routes/index.js - 索引路线
  • routes/users.js - 用户路由

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

我在 index.js 中有一条路线:

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

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

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

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

提交表单后,它会在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 token 。

有什么想法吗?

最佳答案

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

例如:

在 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);

关于node.js - 将路由拆分到不同的文件/模块时获取 "ForbiddenError: invalid csrf token",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37332044/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com