Node.js 重定向时未在Express上设置Csrf令牌

Node.js 重定向时未在Express上设置Csrf令牌,node.js,redirect,express,csrf,Node.js,Redirect,Express,Csrf,我在Express框架中使用csrf中间件。我的登录页面如下所示: app.get('/', getUserOrLogin, function (req, res) { // do something... }); 其中,getUserOrLogin是: // Return the user otherwise redirect to login page var getUserOrLogin = function (req, res, next) { var user = req.s

我在Express框架中使用
csrf
中间件。我的登录页面如下所示:

app.get('/', getUserOrLogin, function (req, res) {
  // do something...
});
其中,
getUserOrLogin
是:

// Return the user otherwise redirect to login page
var getUserOrLogin = function (req, res, next) {
  var user = req.session.user;

  if (user == null) {
    req.session.backTo = req.originalUrl; 
    res.redirect('/login');
  } else {
    req.user = user;
    next();
  }
};
当我尝试访问
/
时,它会将我正确重定向到
/login
,但cookie中的
csrf
令牌未设置


我是否在使用
getUserOrLogin
函数时出错,或者是一个Express bug?

我发现了错误。因为我不想在每个页面上都使用
csrf
控件,所以我使用了一个条件函数:

// Disable CSRF for some requests
var conditionalCSRF = function (req, res, next) {
  var whitelist = ['/inbound'];

  if (req.method !== 'POST') {
    next();
    return;
  }
  if (whitelist.indexOf(req.url) !== -1) {
    next();
  } else {
    (express.csrf())(req, res, next);
  }
};

app.use(conditionalCSRF);
但是该函数不会设置csrf令牌,直到用户需要需要它的页面。所以我用这种方式修改了它

var connect = require('connect');

// Disable CSRF for some requests
var conditionalCSRF = function (req, res, next) {
  var whitelist = ['/inbound'];

  req.session._csrf || (req.session._csrf = connect.utils.uid(24));

  if (req.method !== 'POST') {
    next();
    return;
  }
  if (whitelist.indexOf(req.url) !== -1) {
    next();
  } else {
    (express.csrf())(req, res, next);
  }
};

app.use(conditionalCSRF);

我发现了错误。因为我不想在每个页面上都使用
csrf
控件,所以我使用了一个条件函数:

// Disable CSRF for some requests
var conditionalCSRF = function (req, res, next) {
  var whitelist = ['/inbound'];

  if (req.method !== 'POST') {
    next();
    return;
  }
  if (whitelist.indexOf(req.url) !== -1) {
    next();
  } else {
    (express.csrf())(req, res, next);
  }
};

app.use(conditionalCSRF);
但是该函数不会设置csrf令牌,直到用户需要需要它的页面。所以我用这种方式修改了它

var connect = require('connect');

// Disable CSRF for some requests
var conditionalCSRF = function (req, res, next) {
  var whitelist = ['/inbound'];

  req.session._csrf || (req.session._csrf = connect.utils.uid(24));

  if (req.method !== 'POST') {
    next();
    return;
  }
  if (whitelist.indexOf(req.url) !== -1) {
    next();
  } else {
    (express.csrf())(req, res, next);
  }
};

app.use(conditionalCSRF);

如果将backTo值分配给响应对象而不是请求对象,会发生什么情况?csrf中间件是在路由器之前定义的吗?还有,当你说cookies时,你是指会话吗?除非您正在做其他事情,否则csrf不会设置cookie,只设置
\u csrf
会话令牌。第三,您使用什么进行身份验证,以及登录路由是什么样子的?如果您将backTo值分配给响应对象而不是请求对象,会发生什么情况?csrf中间件是在路由器之前定义的吗?还有,当你说cookies时,你是指会话吗?除非您正在做其他事情,否则csrf不会设置cookie,只设置
\u csrf
会话令牌。第三,您使用什么进行身份验证,以及登录路径是什么样子的?