我正在使用angular.js和csrf(跨站点请求伪造)。
我添加了角度cookie文件。
script src="angular-cookies.js"
然后,将其加载到应用程序中:
angular.module('myApp', ['ngCookies']);
在$ http服务的标题中添加CSRF令牌非常容易。我们只需将其配置到应用程序的运行过程中,需要$ cookie和$ http服务。
.run(function ($http, $cookies) {
$http.defaults.headers.post['x-csrf-token'] = $cookies._csrf;
});
在浏览器调试控制台中,我发现cookie已存在。 但是,当加载页面时,$ cookies输出未定义,奇怪的是$ cookies对象本身是未定义的,但显然我已经加载了cookie.js并将模块注入应用程序
这是在node.js服务器端,我在cookie上设置CSRF令牌
app.use(require('csurf')());
app.use(function(req, res, next){
res.locals.token = req.csrfToken();
res.cookie('XSRF_TOKEN', req.csrfToken(),{ maxAge: 900000, httpOnly: false });
next();
});
感谢您的提醒,我改变了
res.cookie('XSRF_TOKEN', req.csrfToken(),{ maxAge: 900000 });
到
res.cookie('XSRF_TOKEN', req.csrfToken(),{ maxAge: 900000, httpOnly: false });
所以cookie可以从浏览器中读取。
答案 0 :(得分:3)
您的cookie可能被设置为HttpOnly = true,这将设置cookie但不允许客户端查看它因此它返回为未定义。您需要确保此标志设置为false。
答案 1 :(得分:2)
您的服务器需要在第一个HTTP GET请求中在名为XSRF-TOKEN的JavaScript可读会话cookie中设置令牌。
此Cookie必须可以使用Javascript阅读,最好通过index.html页面发送。
完成后,您应该在浏览器中看到它(选项/ cookies ...)
此时,您应该使用角度代码访问它。
如果不是这种情况,您可以尝试使用纯Javascript
访问它_getCookie = function(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++){
var c = ca[i].trim();
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
};
getCookie("XRSF_TOKEN");