如何使用授权头进行GET CORS请求

我正在阅读有关CORS请求,并设法定期GET或POST请求,它工作正常。 但是,当我添加授权头到GET或POST请求,然后预检OPTIONS请求被发送到服务器,我得到500内部服务器错误,实际的请求不会发送。 我的问题是,预检如何实际工作,以及它需要什么响应,以便它将发送主要请求? 是否有可能发送它没有预检,因为我敢肯定,那么它会工作? 这个服务器是用Django 1.6编写的,并且ACCESS-ALLOW-ORIGIN设置为*,它可以和普通的post一起工作并获取请求。

这是我的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 

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

问题在于,根据规范( MDN解释它更简单 ),如果Access-Control-Allow-Credentials设置为true,则Access-Control-Allow-Origin不能包含* ,因此允许任何主机发出附加凭证的请求。

有两种方法可以解决这个问题:

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

使用Django,检查Origin并且可以在Middleware中添加一个头文件,但是这对于自己而言是一个体面的问题(可能已经被问到了)