我正在使用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)
:
如果我在几秒钟之后刷新页面,页面会显示,但在OPTIONS
通话后它不会立即显示。
当我使用Access-Control-Max-Age
标题并增加缓存时间时,我可以再次刷新多次,然后再次发送OPTIONS
调用,这意味着该页面将显示正常。只有在OPTIONS
来电后,GET
电话才会挂起。
当我直接在浏览器中加载网址时,它会很好地显示JSON数据。即使我使用Chrome扩展程序Postman并手动设置Authorization
标头与jQuery请求相同,它仍然可以正常加载数据(尽管我不认为Postman会模拟跨域请求)。
知道为什么GET
请求仍然未决并且没有返回任何错误或标题?
答案 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