HTTP标头设置授权标头停止加载数据

时间:2013-11-03 17:07:59

标签: jquery ember.js http-headers cors http-authentication

我正在使用Ember.js,Ember Simple Auth插件和jQuery使用ajax发送Authorization标头跨域。设置Authorization标头时:

jqXHR.setRequestHeader('Authorization', 'Bearer ' + session.get('authToken'));

然后我收到一个飞行前OPTIONS请求到REST URL,然后我返回以下标题:

$headers->set('Access-Control-Allow-Origin', 'http://subdomain2.domain.com');
$headers->set('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
$headers->set('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept');
$headers->set('Access-Control-Max-Age', 10);
$headers->set('Content-Length', 0);

在Chrome网络监视器中,此OPTIONS请求成功返回。然后,当飞行前OPTIONS请求之后发出GET请求时,GET请求会在网络监视器中挂起或至少显示(pending)

enter image description here

如果我在几秒钟之后刷新页面,页面会显示,但在OPTIONS通话后它不会立即显示。

当我使用Access-Control-Max-Age标题并增加缓存时间时,我可以再次刷新多次,然后再次发送OPTIONS调用,这意味着该页面将显示正常。只有在OPTIONS来电后,GET电话才会挂起。

当我直接在浏览器中加载网址时,它会很好地显示JSON数据。即使我使用Chrome扩展程序Postman并手动设置Authorization标头与jQuery请求相同,它仍然可以正常加载数据(尽管我不认为Postman会模拟跨域请求)。

知道为什么GET请求仍然未决并且没有返回任何错误或标题?

2 个答案:

答案 0 :(得分:2)

不确定这里的问题是什么。看起来你正在遇到某事。与此类似:cross-origin 'Authorization'-header with jquery.ajax()

另外,您是否更改了Ember.SimpleAuth代码中的任何内容?因为出于安全原因,默认情况下它不应该在跨域请求中包含令牌......

您可能还想在jQuery中查看这个已知问题:Sending credentials with cross-domain posts?这也与发送跨域授权标头有关。

我将研究Ember.SimpleAuth如何在这种情况下提供帮助。

答案 1 :(得分:0)

我做了一些调查:一般来说,Ember.SimpleAuth应该与CORS合作。

我认为你缺少的是什么
Access-Control-Allow-Origin: http://subdomain2.domain.com

对GET请求的响应中的标头。另请参阅Mozilla文档中的示例:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS。每个响应都必须包含Access-Control-Allow-Origin标头。

HTH