バイタル:
Chrome バージョン 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を読み込めません。オリジンhttp://prototypes.mycompany.comは Access-Control-Allow-Origin で許可されていません。
私はもともと*
許可されたオリジンとして始めましたが、まったく同じ問題で失敗します。
iOS 5 の Mobile Safari と Firefox でもこの問題を再現しました。Firefox では、この動作はさらに混乱します。サーバーは 200 OK を返し、次に 6 ~ 7KB のデータを返します (これは私の予想です)。クライアント側のログは、200 OK と ~300 バイトのデータ (応答ヘッダーなし、応答なし...) を取得し、「エラー」ハンドラーをトリガーしたことを示しています。
私は何が欠けていますか?