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

我正在使用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请求返回成功。 然后当GET请求出现在飞行前OPTIONS请求之后, GET请求就会挂起或至少在网络监视器中说(pending)

在此处输入图像描述

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

当我使用Access-Control-Max-Age标头并增加缓存时间时,我可以在再次发送OPTIONS调用之前刷新很多次,这意味着页面将显示正常。 只有当OPTIONS调用在挂起后立即带有GET时才会出现。

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

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

不确定这里的问题是什么。 看起来你正在遇到某事。 类似于: 使用jquery.ajax()的跨源’Authorization’标头

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

您可能还想在jQuery中查看这个已知问题: 使用跨域post发送凭据? 这也与发送授权标题跨域有关。

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

我做了一些调查:一般来说,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