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)
你是如何检查cookie的存在的?
$http它只是浏览器XHR的包装器,就像jQuery $.ajax和朋友一样.这意味着您的浏览器将正常处理cookie.
我的猜测是cookie 已被设置,但你正试图通读它document.cookie. HttpOnly防止脚本访问cookie. 这是一件好事.
HttpOnly有助于缓解XSS攻击.它使恶意脚本无法窃取用户的会话令牌(以及他们的登录). 不要关掉HttpOnly.
无论如何你不应该需要cookie.由于$http它只是XHR的包装器,因此浏览器将在您下次发出请求时自动发送cookie.您可以通过在开发人员工具的"网络"面板中查看请求来验证这一点.
我通过设置{withCredential : true}角度$http请求并通过设置来解决问题:
res.header("Access-Control-Allow-Credentials", true);
Run Code Online (Sandbox Code Playgroud)
在我的快速服务器配置中.通过这样做,我的cookie显示在我的浏览器cookie列表中.
| 归档时间: |
|
| 查看次数: |
23196 次 |
| 最近记录: |