如何使用授权标头发出 GET CORS 请求

Posted

技术标签:

【中文标题】如何使用授权标头发出 GET CORS 请求【英文标题】:How to make GET CORS request with authorization header 【发布时间】:2014-09-23 17:00:14 【问题描述】:

我正在阅读有关 CORS 请求的信息,并且我已经设法发出常规的 GET 或 POST 请求并且它工作正常。但是,当我将授权标头添加到 GET 或 POST 请求时,预检 OPTIONS 请求将发送到服务器,我得到 500 INTERNAL SERVER ERR,但实际请求并未发送。我的问题是预检实际上是如何工作的,它需要什么响应才能发送主请求?是否可以在没有预检的情况下发送它,因为我确信它会起作用? server-rside 是用 Django 1.6 编写的,并将 ACCESS-ALLOW-ORIGIN 设置为 *,它适用于常规的 post 和 get 请求。

这是我的 JS 代码:

 $.ajax(
  type: "GET",
  url: "http://url/login/",
  async:false,
  contentType: "application/json",
  headers: 
    "Authorization": "Basic " + btoa(loginName + ':' + password),       
  ,
  success: function (data) 
    alert("OK!");
  ,
  failure: function(errMsg) 
    alert(errMsg);
  
);

这些是执行请求时来自 Chrome DevTools 的标头: 请求头:

OPTIONS /login/ HTTP/1.1
Host: url
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (Khtml, like Gecko)     Chrome/36.0.1985.125 Safari/537.36
Access-Control-Request-Headers: accept, authorization, content-type
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,hr;q=0.6,sr;q=0.4

响应标头:

HTTP/1.1 500 INTERNAL SERVER ERROR
Date: Thu, 31 Jul 2014 16:15:19 GMT
Server: Apache/2.2.15 (CentOS)
X-Frame-Options: SAMEORIGIN
Access-Control-Allow-Origin: *
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8

【问题讨论】:

【参考方案1】:

要传递授权标头,您必须将 Access-Control-Allow-Credentials 设置为 true。

问题在于,根据规范 (MDN explains it simpler),如果 Access-Control-Allow-Credentials 设置为 true,Access-Control-Allow-Origin 不能包含 *,因此允许任何主机发出带有凭据的请求。

解决这个问题有两种选择:

Access-Control-Allow-Origin 设置为实际发出请求的主机 如果有多个主机:“规范”方法是在应用程序本身中设置一个主机白名单,而不是检查 Origin 标头(如果它在列表中)并将 Origin 添加为 Access-Control-Allow-Origin 标头值。

使用 Django,检查 Origin 并在中间件中添加标头,但这本身就是一个不错的问题(并且可能已经被问过)

【讨论】:

以下情况的最佳选择是什么?需要通过标头身份验证发送具有跨域来源的 Get 请求。它在 chrome 和 firefox 中工作正常,但在 safari 和 IE 中也有问题,在随机情况下它也会返回 401。 IE 不支持 URL support.microsoft.com/en-in/kb/834489 中的用户名和密码 @p4pravin 传递用户名并传入 url 是后端系统(即您发送请求的那个)绝对“必须发生”的要求吗?如果没有,也许使用Authorization 标头会更好。 John ,这不是必须的要求,但我正在使用 bigcommerce 并试图从其他服务器获取数据,所以我发现只有 ajax jsonp 在这种情况下会有帮助,如果我通过使用授权, jsonp调用将类型更改为“选项”,如果我更改授权标头并且不适用于jsonp调用,因为它只支持get,我相信。 @p4pravin 我建议您将其作为单独的问题发布。 谢谢约翰,我现在已经有单独的问题***.com/questions/41296328/…

以上是关于如何使用授权标头发出 GET CORS 请求的主要内容,如果未能解决你的问题,请参考以下文章

DART HttpRequest 不为 CORS OPTIONS 请求提供授权标头

当提供商因缺少授权标头而拒绝飞行前请求时,使客户端CORS正常工作

如何 CORS 允许 Sails 中的标头

访问 CORS 请求的响应标头

CORS 使用“授权”标头和数据阻止 axios 请求

获取 API、自定义请求标头、CORS 和跨域重定向