1

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のバグですか?

4

1 に答える 1

1

エラーが見つかりました。すべてのページを制御したくないので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);
于 2012-11-29T09:43:02.293 に答える