Node.js 重定向时未在Express上设置Csrf令牌
我在Express框架中使用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
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
会话令牌。第三,您使用什么进行身份验证,以及登录路径是什么样子的?