2012-11-28 27 views
1

我正在使用csrf中间件与Express框架。我登录页是这样的:Csrf令牌未在Express上设置时重定向

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但在饼干csrf令牌未设置。

我是否在getUserOrLogin函数中做错了什么,或者是一个Express错误?

+0

如果将backTo值分配给* response *对象而不是* request *对象,会发生什么? –

+1

在路由器之前定义了csrf中间件吗?另外,当你说cookie时你是指会话吗?除非你正在做别的事情,否则csrf不会设置cookie,只是'_csrf'会话令牌。第三,你用什么来验证,登录路线是什么样的? – numbers1311407

回答

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