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

Jquery HTTP标头设置授权标头将停止加载数据,jquery,ember.js,http-headers,cors,http-authentication,Jquery,Ember.js,Http Headers,Cors,Http Authentication,我正在使用Ember.js、Ember Simple Auth插件和jQuery,使用ajax跨域发送授权标题。设置授权标题时: jqXHR.setRequestHeader('Authorization', 'Bearer ' + session.get('authToken')); 然后,我得到一个到REST URL的飞行前OPTIONS请求,然后返回以下标题: $headers->set('Access-Control-Allow-Origin', 'http://subdomai

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

jqXHR.setRequestHeader('Authorization', 'Bearer ' + session.get('authToken'));
然后,我得到一个到REST URL的飞行前
OPTIONS
请求,然后返回以下标题:

$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网络监视器中,此
选项
请求返回成功。然后,当GET请求在飞行前
选项
请求之后出现时,
GET
请求只是挂起,或者至少在网络监视器中显示
(挂起)

如果几秒钟后刷新页面,页面将显示出来,但在调用
选项后不会立即显示

当我玩
Access Control Max Age
标题并增加缓存时间时,我可以在它再次发送
OPTIONS
调用之前刷新多次,这意味着页面将显示得很好。只有当
选项
调用与
GET
一起出现时,它才会立即挂起

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


知道为什么
GET
请求仍处于挂起状态并且不返回任何错误或标题吗?

不确定这里的问题是什么。看起来你遇到了类似的事情:

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

您可能还想看看jQuery中的这个已知问题:这也与跨域发送授权头有关


我将研究Ember.SimpleAuth在这种情况下可能有什么帮助。

我做了一些调查:一般来说,Ember.SimpleAuth应该与CORS一起工作。我想你缺少的是

Access-Control-Allow-Origin: http://subdomain2.domain.com
GET请求响应中的标头。另请参见Mozilla文档中的示例:。每个响应必须包含Access Control Allow Origin标头


HTH

这很奇怪,因为如果我刷新它,它似乎可以工作,所以我会在
选项
请求之后返回正确的标题。我没有更改
SimpleAuth
代码-我注意到了if(!jqXHR.crossDomain&&!Ember.isEmpty(session.get('authToken'))中的
行{
但是
jqXHR
对象不包含
crossDomain
属性…我实际上发现跨域属性在
选项
对象中。可能是系统中的错误或差异?我已经通过将
REST
服务器更改为同一个域暂时解决了这个问题。我认为它不是
对象>SimpleAuth
问题,可能是一个bug…我不确定。我还尝试在发送
授权
标题之前添加
jqXHR.withCredentials=true;
,但这并不能解决问题。感谢检查。我肯定会返回此值,正如您从上面的问题
$headers->set中所看到的('Access-Control-Allow-Origin','http://subdomain2.domain.com')
当我快速刷新时,它会工作,因此它肯定不会阻止跨域请求。也许这是我系统中的某个错误,我会做更多的检查。嗯,看起来你在选项请求的响应中只有标题,而不是GET。你在日志中看到了什么吗?啊,不,GET和OPTIONS都有。如果我没有它的GET没有一个请求会起作用。看起来真的很奇怪。