2012-11-26 12 views
5

バイタル一致していてもアクセス制御 - 許可 - 起源によって拒否:XmlHttpRequestの原点が完全

クロームバージョン23.0.1271.64 のMac OS X 10.8.2

状況:

を私は持っていますhttps://api.myapi.com/に公開されているWebサービス JavaScriptアプリケーションとこのAPIとの対話を許可したいと思います。 CORSは、明らかに最良のフィット感(jsonpと友人はひどい、ひどいハックである)のように感じます。私は、プリフライトリクエストが送信されている私の開発者ツールで見ることができる

Request URL: https://api.myapi.com/someapi 
Request Method: OPTIONS 
Status Code: 200 OK 

Request Headers 

Accept: */* 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Access-Control-Request-Headers: origin, authorization, accept 
Access-Control-Request-Method: GET 
Connection: keep-alive 
Host: api.myapi.com 
Origin: http://prototypes.mycompany.com 
Referer: http://prototypes.mycompany.com/somepage.html 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 

Response Headers 

Access-Control-Allow-Headers: Accept,Authorization,Content-Length,Content-Type,Cookie 
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS 
Access-Control-Allow-Origin: http://prototypes.mycompany.com 
Access-Control-Allow-Credentials: true 
Connection: close 

これは特に、応答Access-Control-Allow-Originヘッダを正確に要求Originヘッダーを一致させるように思われる、非常に良い感じです。

直後に、実際の要求が試行されます。

Request URL: https://api.myapi.com/someapi 

Request Headers 

Accept: application/json, text/javascript, */*; q=0.01 
Authorization: <custom authentication scheme, removed> 
Origin: http://prototypes.mycompany.com 
Referer: http://prototypes.mycompany.com/somepage.html 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11 

それは、その後、「キャンセル」として表示され、次のエラーが放出されます。

のXMLHttpRequestがhttps://api.myapi.com/someapiをロードすることはできません。 Origin http://prototypes.mycompany.comは、Access-Control-Allow-Originによって許可されていません。

私は元来許可された起源として*で開始しましたが、これはまったく同じ問題で失敗します。

私は、Mobile Safari for iOS 5とFirefoxでこの問題を再現しました。 Firefoxでは、この動作はさらに混乱します。 サーバは200 OKと応答し、次に6〜7KBのデータを返します(これは私の予想どおりです)。クライアント側のログには、200 OKと〜300バイトのデータがあり(応答ヘッダーがなく、応答がない...)、「エラー」ハンドラーがトリガーされます。

私には何が欠けていますか?

答えて

1

問題を解決!私はgdbを見つけ出す必要がありました。

プロキシサーバーが要求に独自のCORSヘッダーを挿入していました。そのため、HTTPセッションでは、ヘッダが複数回指定されていました。セキュリティチェックは最初のヘッダー( "*")と照合しており、要求に失敗しました。要求の失敗により、最後のヘッダーの値が正しく表示されます。

非常に役に立たない、WebKit!

0

アイデア:

  • 私はあなたのAccess-Control-Allow-HeadersOriginを持っていません注意してください。私は彼らが必要であるとは思わないでしょうが、あなたはContent-Lengthです。私はそれが必要ではないと思います。

  • Authorizationを使用していますが、credentialsを使用すると思われますか? (どうやら時にはあなたが応じてAccess-Control-Allow-Credentials: trueを含めることになっている。)

(これらは、かろうじて「答え」を値するが、愚かなコメントは改行を許可していません。)

+0

質問を投稿して以来、私は 'Access-Control-Allow-Credentials'を追加しましたが効果はありません。私は 'Origin'を追加しますが、これは問題ではないと思います - エラーメッセージが無効なヘッダーが指定されたことを報告しませんか? –

関連する問題