Node.js CSRF令牌在nodejs express中不工作

Node.js CSRF令牌在nodejs express中不工作,node.js,cookies,express,csrf,csrf-protection,Node.js,Cookies,Express,Csrf,Csrf Protection,我正在使用nodejs、express开发一个简单的web应用程序,当我切换到session和csrf时,我的PUT、DELETE和POST请求都失败了。 有误: 错误:在createToken(appFolder/node\u modules/express/node\u modules/connect/lib/utils.js:63:13)的Object.exports.error(appFolder/node\u modules/express/node\u modules/connect

我正在使用nodejs、express开发一个简单的web应用程序,当我切换到session和csrf时,我的PUT、DELETE和POST请求都失败了。 有误:

错误:在createToken(appFolder/node\u modules/express/node\u modules/connect/lib/utils.js:63:13)的Object.exports.error(appFolder/node\u modules/express/node\u modules/connect/lib/middleware/csrf.js:82:55)处禁止使用

我查看了这一行,发现它调用了
checkToken
调用defaultValue,在请求中查找csrf令牌,如下所示:

function defaultValue(req) {
  return (req.body && req.body._csrf)
    || (req.query && req.query._csrf)
    || (req.headers['x-csrf-token'])
    || (req.headers['x-xsrf-token']);

}
这给出了null或未定义的值,我的checkToken失败了

我的PUT请求由主干生成,我只发送模型的数据。所以我开始用cookie把令牌寄回去。 我在cookie中设置令牌,如下所示:

app.use(express.cookieParser());
app.use(express.session({
    secret: '6767678376-3hudh-2u78di90-kjdu39i-jfujd'
}));
app.use(function(req,res,next) {
    console.log("Body "  + JSON.stringify(req.headers));
    return next();
});
app.use(express.csrf());


app.use(express.static(path.join(__dirname, 'public')));

app.use(function(req, res, next) {
    console.log(req.body);
    res.cookie('x-csrf-token', req.csrfToken());
    console.log('CSRF : ' + req.csrfToken());
    //res.session._csrf = req.csrfToken();
    return next();
});
并将
defaultValue(req)
更改为

function defaultValue(req) {
  var csrf_token = (req.body && req.body._csrf)
    || (req.query && req.query._csrf)
    || (req.headers['x-csrf-token'])
    || (req.headers['x-xsrf-token']);
  if(csrf_token)
    return csrf_token;

  // find in cookie.
  if(!req.headers['cookie'])
    return undefined;

  var csrfTokenInCookie = (req.headers['cookie'].split('x-csrf-token='));
  if(csrfTokenInCookie && (csrfTokenInCookie.length == 2)) {
    return csrfTokenInCookie[1];
  }
  var xsrfTokenInCookie = (req.headers['cookie'].split('x-xsrf-token='));
  if(xsrfTokenInCookie && (xsrfTokenInCookie.length == 2)) {
    return xsrfTokenInCookie[1];
  }
}
现在defaultValue正确地给出了csrftoken令牌,但再次
checkToken
失败

文件如下:

我做错了什么


或者它如何不能生成回正确的令牌?

您的问题在于Express没有将CSRF令牌发送回POST/PUT/DELETE请求的标头中。Express的CSRF中间件在头丢失时拒绝这些请求是正确的


以下是有关在主干中添加所需标头的信息:

您尝试验证cookie和express会话时,这些将是不同的令牌,因此将失败。您必须选择cookie或令牌中的一个

作者在这里提到了它


就我个人而言,我建议完全禁用Cookie,并通过标题和表单主体传递令牌——这对我很有效。

甚至没有评论:(我尝试了:
$.ajaxSetup({headers:{'x-csrf-token':getCookie(“x-csrf-token”)};
但这不起作用。同样,它得到了csrf令牌,但当它调用chcekToken时(token_i_send,secret)它失败了。很高兴你找到了答案。如果你想编写mocha测试,这里有一些更详细的信息: