5

バイタル:

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 バイトのデータ (応答ヘッダーなし、応答なし...) を取得し、「エラー」ハンドラーをトリガーしたことを示しています。

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

4

2 に答える 2

0

アイデア:

  • Origin私はあなたが持っていないことに気付きましたAccess-Control-Allow-Headers. 私はそれらが必要だとは思いませんが、あなたは持っていますしContent-Length、私もそれが必要だとは思いません.

  • を使用していますが、資格情報Authorizationを使用する必要があると思いますか? (明らかに、応答に含めることになっている場合があります。)Access-Control-Allow-Credentials: true

(これらはほとんど「回答」に値しませんが、愚かなコメントは改行を許可しません。)

于 2012-11-27T00:53:18.533 に答える