1

Authorization我正在使用 Ember.js、Ember Simple Auth 插件和 jQuery使用 ajax 跨域发送标头。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 请求在飞行前请求之后出现时OPTIONSGET请求只是挂起或至少(pending)在网络监视器中显示:

在此处输入图像描述

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

当我使用Access-Control-Max-Age标头并增加缓存时间时,我可以在它再次发送调用之前刷新多次,OPTIONS这意味着页面将显示得很好。只有当OPTIONS呼叫GET紧随其后时,它才会挂起。

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

知道为什么GET请求仍然挂起并且不返回任何错误或标头吗?

4

2 回答 2

2

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

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

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

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

于 2013-11-04T17:16:28.303 回答
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 标头。

高温高压

于 2013-11-13T09:39:44.090 回答