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 个文件:
- 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 令牌:
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');
...
});
问题似乎与两个文件都必须创建 csrf
和 csrfToken
的新实例有关。在两个路由文件的开头,我都这样要求它们:
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);
我正在使用 csurf in my 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 令牌:
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');
...
});
问题似乎与两个文件都必须创建 csrf
和 csrfToken
的新实例有关。在两个路由文件的开头,我都这样要求它们:
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);