如何使用授权标头发出 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 请求提供授权标头