2017-01-16 8 views
3

My FEアプリケーションは異なるドメインのAPIを使用しています。私はそれがCORSを引き起こすはずであることを知っていますが、私が理解しているように、すべての要求に対してプリフライトを作成するべきではありません。プリフライトリクエストはすべてのメソッドで送信されます

docsによると、GETメソッドのプリフライトリクエストはありません。

Cross-site requests are preflighted like this since they may have implications to 
user data. In particular, a request is preflighted if: 

    - It uses methods other than GET, HEAD or POST. 
Also, if POST is used to send request data with a Content-Type 
other than application/x-www-form-urlencoded, multipart/form-data, 
or text/plain, e.g. if the POST request sends an XML payload to the 
server using application/xml or text/xml, then the request is preflighted. 
    - It sets custom headers in the request 
(e.g. the request uses a header such as X-PINGOTHER) 

しかし、私が送信していますすべてのリクエストは、プリフライト(OPTIONS)要求を持って、どんなにそれがGETまたはPOSTだ場合、私はそれ奇妙な(ドキュメントが言ったことによる)を見つけます。

私はいくつかのヘッダーを設定する(と私はwithCredentials: trueでそれを送信しています)が、私はそれが問題であることを表示されません。

headers.append('Access-Control-Allow-Origin', FRONTEND_URL); 
    headers.append('Accept', 'application/json'); 
    headers.append('Content-Type', 'application/json'); 
    headers.append('Authorization', this._generateApiKey()); 
    headers.append('Language', this._languageISOCode); 

私は何かが足りないのですか?

+1

WithCredentialsそれがGET/POSTのためのプリフライトます意味カスタムヘッダーは、_that – Icepickle

答えて

2

は、単純な要求のContent-Typeヘッダのためにのみ許可された値はapplication/x-www-form-urlencodedmultipart/form-data、およびtext/plainをしている、でも、GET要求を

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Simple_requestsを参照してください。その他のContent-Type値は、ブラウザにプリフライトを実行させます。事実(CORSの振る舞いを定義する)フェッチ仕様から次

は、それが定義する、CORS-safelisted request-headerを呼び出すかを指定一方のような:

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Typeであり、値が一度解析されると、application/x-www-form-urlencoded,multipart/form-data、またはのMIMEタイプ(パラメータを無視する)があります

任意の要求を含む任意のGET要求-はプリフライトをトリガCORS-safelistedリクエストヘッダではないヘッダを含んでいます。このすべてが、より明確に支援するため


は、私がthe MDN documentation about CORS “simple requests”the MDN documentation about CORS preflighted requestsを更新し(実際には、しかし、少し複雑前述しているものよりも何上記のは、この質問の文脈で十分)。 WebKitの/ SafariがAcceptで許可された値、Accept-Language、およびContent-Languageヘッダに追加の制限を課すこと


は注意してください。

これらのヘッダーのいずれかが「標準ではない」値を持つ場合、WebKit/Safariはプリフライトを行います。限りのWebKit/Safariはこれらのヘッダのための「非標準」の値を考慮したものと、それは本当に、次のWebKitのバグを除き、文書化されていない

これらの追加の制限は、仕様に含まれていないため、他のブラウザで実装されていません。彼らはWebKitに仕様エディタや他のブラウザとの議論なしに一方的に追加されました。

+0

を要求CORS-safelisted要求header_ではありませんされて - あなたはそれはあなたが示した4つのヘッダのリストにない意味ですか? –

+0

はい、上の4つのヘッダーのリストに含まれていないヘッダー。 – sideshowbarker

0

通常、ドメイン間の問題は、アプリケーションが1つのドメインでホストされ、Webサービスが別のドメインでホストされているときに発生し、応答を取得するためにAjax呼び出しを実行しようとしています。 WebサービスへのAjax呼び出しがCORSエラーで終了しました。呼び出されたHTTPメソッドは、GETまたはPOSTではなくOPTIONSでした。

この問題の解決は1つの側面でしたが、引き続きセキュリティ認証を保持する必要がありました。さもなければ、私達は最終的に脅威である認証されていないウェブサービスを公開するでしょう。

if (request.getMethod().equals("OPTIONS") && request.getHeader(ORIGIN).equals(FRONTEND_URL)) 
{ 
response.setHeader("Access-Control-Allow-Origin", FRONTEND_URL); 
response.setHeader("Access-Control-Allow-Credentials", "true"); 
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, HEAD"); 
response.setHeader("Access-Control-Allow-Headers",request.getHeader("Access-Control-Request-Headers")); 
} 
関連する問題