Angularjs $ http似乎并不了解响应中的“Set-Cookie”

我有一个nodejs表示REST api与Passport模块进行身份validation。 login方法(GET)在标题中返回一个cookie。 当我从Chrome调用它时,它工作正常,我的cookie被设置在我的浏览器中。

但是如果我通过Angularjs的$ http来调用它,那么cookie不会被设置。

Set-Cookie:connect.sid=s%3Ad7cZf3DSnz-IbLA_eNjQr-YR.R%2FytSJyd9cEhX%2BTBkmAQ6WFcEHAuPJjdXk3oq3YyFfI; Path=/; HttpOnly 

正如你所看到的,Set-Cookie存在于http服务响应的头部。

也许HttpOnly可能是这个问题的根源? 如果是的话,我该如何改变它? 这是我的快速configuration:

 app.configure(function () { app.use(allowCrossDomain); app.use(express.bodyParser()); app.use(express.cookieParser()) app.use(express.session({ secret: 'this is a secret' })); app.use(flash()); //passport init app.use(passport.initialize()); app.use(passport.session()); app.set('port', process.env.PORT || 8080); }); 

感谢您的帮助

       

网上收集的解决方案 "Angularjs $ http似乎并不了解响应中的“Set-Cookie”"

确保将您的$ http请求configuration为使用凭据。 从XHR文档:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

XMLHttpRequest和访问控制都暴露的最有趣的function是能够做出“凭证”的请求,认识到HTTP Cookie和HTTPauthentication信息。 默认情况下,在跨站点XMLHttpRequest调用中,浏览器不会发送凭据。 调用时,必须在XMLHttpRequest对象上设置特定的标志。

您可以使用选项对象来设置凭据的使用,请参阅

http://docs.angularjs.org/api/ng.$http

例:

 $http({withCredentials: true, ...}).get(...) 

你如何检查cookie的存在?

$http只是浏览器的XHR的一个包装,就像jQuery的$.ajax和朋友一样。 这意味着您的浏览器将正常处理cookie。

我的猜测是cookie 正在被设置,但是你正试图通过document.cookie来读取它。 HttpOnly阻止脚本访问cookie。 这是一件好事。

HttpOnly有助于缓解XSS攻击。 它使得恶意脚本不可能窃取用户的会话令牌(从而他们的login)。 不要closuresHttpOnly

无论如何,你不应该需要cookie。 由于$http只是XHR的一个包装,浏览器会在下一次发出请求时自动发送cookie。 您可以通过在开发工具的“networking”面板中查看请求来validation此情况。

我通过在angular度$http请求中设置{withCredential : true}并通过设置来解决这个问题:

 res.header("Access-Control-Allow-Credentials", true); 

在我的快递服务器configuration。 通过这样做,我的cookie出现在我的浏览器cookies列表中。

您可以通过configurationexpress.session来更改它:

 app.use(express.session({ secret : 'this is a secret', cookie : { httpOnly : false, maxAge : XXX // see text } }); 

但是我不认为Angular会关心cookie,这些都是由浏览器处理的(我同意@ josh3736你应该保持httpOnlytrue )。

这可能与您的Cookie(浏览器)会话Cookie有关。 您可以尝试通过明确设置cookie的maxAge (以毫秒为单位)来更好地工作。