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
- 请求的资源上没有“Access-Control-Allow-Origin”标头,响应具有HTTP状态代码401
- Java Spring REST API CORS不适用于通过jQuery与Chrome进行DELETE请求
- 如何从javascript调用IBM Watson服务
- Jirarest客户端在javascript给出错误
- Safari Ajax cors请求不遵循重定向
- 允许cors jQuery POST请求Express.js服务器上的Spotify API
- Java RESTful服务的Jquery调用不工作CORS
- Authorization Header仅在AJAX CORS请求中附加一次
- 为什么我的Drupal 8 CORS设置不起作用?