Angularjs $ http似乎不理解响应中的"Set-Cookie"

Fre*_*iot 25 node.js express angularjs

我有一个nodejs用Passport模块表示REST api进行身份验证.登录方法(GET)在标头中返回一个cookie.当我从Chrome调用它时,它运行正常,我的cookie在我的浏览器中设置.

但是如果我通过Angularjs的$ http调用它,则cookie不会被设置.

Set-Cookie:connect.sid=s%3Ad7cZf3DSnz-IbLA_eNjQr-YR.R%2FytSJyd9cEhX%2BTBkmAQ6WFcEHAuPJjdXk3oq3YyFfI; Path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)

如您所见,Set-Cookie存在于http服务响应的标头中.

也许HttpOnly可能是这个问题的根源?如果是,我该如何更改?这是我的快速配置:

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);
});
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

Tho*_*mas 19

确保配置$ http请求以使用凭据.从XHR文档:

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

XMLHttpRequest和Access Control公开的最有趣的功能是能够发出认证HTTP Cookie和HTTP身份验证信息的"凭证"请求.默认情况下,在跨站点XMLHttpRequest调用中,浏览器不会发送凭据.调用XMLHttpRequest对象时,必须在其上设置特定标志.

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

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

例:

$http({withCredentials: true, ...}).get(...)
Run Code Online (Sandbox Code Playgroud)

  • 但是AngularJS仍然不理解响应中的`set-cookie`. (3认同)

jos*_*736 5

你是如何检查cookie的存在的?

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

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

HttpOnly有助于缓解XSS攻击.它使恶意脚本无法窃取用户的会话令牌(以及他们的登录). 不要关掉HttpOnly.

无论如何你不应该需要cookie.由于$http它只是XHR的包装器,因此浏览器将在您下次发出请求时自动发送cookie.您可以通过在开发人员工具的"网络"面板中查看请求来验证这一点.


Fre*_*iot 5

我通过设置{withCredential : true}角度$http请求并通过设置来解决问题:

res.header("Access-Control-Allow-Credentials", true);
Run Code Online (Sandbox Code Playgroud)

在我的快速服务器配置中.通过这样做,我的cookie显示在我的浏览器cookie列表中.