无法访问angular.js $ cookies对象

时间:2014-09-09 12:06:31

标签: angularjs cookies

我正在使用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可以从浏览器中读取。

2 个答案:

答案 0 :(得分:3)

您的cookie可能被设置为HttpOnly = true,这将设置cookie但不允许客户端查看它因此它返回为未定义。您需要确保此标志设置为false。

答案 1 :(得分:2)

根据angularJS documentation

  

您的服务器需要在第一个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");