web-dev-qa-db-ja.com

AjaxリクエストヘッダーフィールドキーはAccess-Control-Allow-Headersで許可されていません

DNNサービスフレームワークWebAPIを構築しようとしていますが、CORSでの使用に問題があります。私は適切なヘッダーをすべて持っています(と思います)が、まだ機能していないようです。

エラー:

XMLHttpRequest cannot load http://www.dnndev.me/mysite/builder/API/echo?message=Hello+World&_=1412707749275. Request header field Key is not allowed by Access-Control-Allow-Headers.

リクエストヘッダー:

Remote Address: 127.0.0.1:80
URL: http://www.dnndev.me/mysite/builder/API/echo?message=Hello
Request Method: OPTIONS
Status Code: 200 OK
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Access-Control-Request-Headers: accept, key
Access-Control-Request-Method: GET
Connection: keep-alive
Host: www.dnndev.me
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36

応答ヘッダー:

Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key
Access-Control-Allow-Methods: *
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Content-Length: 13
Content-Type: application/json; charset=utf-8
Date: Tue, 07 Oct 2014 18:49:10 GMT
Expires: -1
Pragma: no-cache
Server: Microsoft-IIS/7.5

通常、このエラーは「Access-Control-All-Headers」に適切なヘッダーがないために発生します。ただし、私はajaxがリクエストを続行できるように正しい応答を送信しています。単に拒否します。

メソッドへの私のajax呼び出しは次のとおりです。

$.ajax({
    type: 'GET',
    url: 'http://www.dnndev.me/mysite/builder/API/echo',
    dataType: 'json',
    data: { message: 'Hello' },
    crossDomain: true,
    headers: { 'Key': 'Bearer 7680ff6e-1362-4236-a9cd-c6bc8b6f13ea' },
    success: function (result) { console.log(result); }
});

おそらく明らかですが、これはクロスドメインリクエストでのみ発生し、カスタムヘッダーを含める場合にのみ発生します(したがって、ajaxにOPTIONSを実行させる)。

15
NorianNyx

サーバーは、プリフライトリクエストに次のカスタムヘッダーで応答します。

Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key

一方、あなた(またはこのサーバーを書いた人)がCORSについて注意深く読んだ場合、彼は次のように応答すべきでした:

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key

これで、クライアントクライアントはKeyカスタムヘッダーを使用できます。

これは、BearerAuthorizationヘッダー全体に送信されるOAuth 2に固有です。Keyの使用はひどい違反のようですRFCとスタッフと車輪の再発明の種類。

22
Darin Dimitrov

これをサーバーの応答ヘッダーに追加します。

header( 'Access-Control-Allow-Headers:Origin、Content-Type、X-Auth-Token、Authorization');

2
Hasan

Nyxの質問のタイプミスとDarinの答えに注意してください(「ow」がありません)。っていうことは

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key

ブラウザのOPTIONリクエストへの回答として送信された場合、「リクエストヘッダーフィールドsome-header-fieldはプリフライトモードのAccess-Control-Allow-Headersでは許可されません」というエラーメッセージを解決します。

2
Zartag