簡體   English   中英

如何使用授權標頭進行GET CORS請求

[英]How to make GET CORS request with authorization header

我正在閱讀有關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);
  }
});

這些是執行請求時來自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標頭是否在列表中,然后將Origin添加為Access-Control-Allow-Origin標頭值。

使用Django,可以在中間件中檢查Origin並添加標頭,但這本身就可能引起一個不錯的問題(可能已經有人問過)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM