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); });
感谢您的帮助
确保将您的$ 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你应该保持httpOnly
为true
)。
这可能与您的Cookie(浏览器)会话Cookie有关。 您可以尝试通过明确设置cookie的maxAge
(以毫秒为单位)来更好地工作。