web-dev-qa-db-ja.com

認証ヘッダーを使用してGET 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);
  }
});

これらは、リクエストが実行されたときの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
11
Matija

承認ヘッダーを渡すには、Access-Control-Allow-Credentialsをtrueに設定する必要があります。

問題は、仕様( MDNで簡単に説明しています )に従って、Access-Control-Allow-Credentialsがtrueに設定されている場合、Access-Control-Allow-Origin*を含めることができないため、資格情報が添付されたリクエストを作成するすべてのホストを許可します。

この問題を解決するには、次の2つのオプションがあります。

  • Access-Control-Allow-Originをリ​​クエストを行う実際のホストに設定します
  • ホストが複数ある場合:「正規」の方法は、アプリケーション自体にホストのホワイトリストを含めることです。リストにある場合はOriginヘッダーを確認し、OriginAccess-Control-Allow-Originヘッダー値として追加します。

Djangoを使用すると、Originを確認し、ミドルウェアでヘッダーを追加できますが、それ自体で適切な質問が行われます(おそらくすでに質問されています)。

20
J0HN