如何使用授权标头生成GET CORS请求

Mat*_*ija 9 apache django ajax jquery cors

我正在阅读有关CORS请求的信息,我已经设法定期发送GET或POST请求,并且工作正常.但是当我向GET或POST请求添加授权标头时,预检OPTIONS请求被发送到服务器,我得到500 INTERNAL SERVER ERR,并且不发送实际请求.我的问题是预检实际上是如何工作的,它需要什么样的响应才能发出主要请求?是否可以在没有预检的情况下发送它,因为我确信它会起作用?serve-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);
  }
});
Run Code Online (Sandbox Code Playgroud)

这些是执行请求时来自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
Run Code Online (Sandbox Code Playgroud)

响应标头:

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
Run Code Online (Sandbox Code Playgroud)

J0H*_*0HN 16

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

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

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

  • 设置Access-Control-Allow-Origin为实际主机发出请求
  • 如果有多个主机:"规范"方式是在应用程序本身中拥有主机白名单,而不是检查Origin标头是否在列表中并添加OriginAccess-Control-Allow-Origin标头值.

使用Django,Origin可以在Middleware中检查并添加标题,但这会在它自己的问题上提出一个不错的问题(可能已经被问到)