バックグラウンド
(CORSに精通している場合は、最後の質問にスキップできます)
CORS [1]は、ブラウザがさまざまなドメインからのリソースへのアクセスを許可できるようにするソリューションです。たとえば、AJAXを使用したRESTデータバックエンド。
Chrome(およびWebkitの友達)がHTTP認証プロンプトを処理しないことは、そのようなリソースが要求するときにインターネット上でよく観察されています。例[2](これは、たとえば、画像タグの読み込みが401で失敗し、資格情報が必要な場合に、Webメールのサインインページでブラウザが認証ログインダイアログを表示しないようにするためです。ウェブメールの資格情報)
この状況でのChromeの動作は、応答をドロップし、ほとんどサイレントにリクエストをキャンセルすることです。
実際、Chromeは200が発生した場合にのみ通常どおり応答を許可します。その他のステータスコードはすべて飲み込まれ、AJAX呼び出しは中止されます。
jQueryを使用してAjaxリクエストを実行し、リモートサイトがHTTP 401ステータスコードで応答した場合、リクエストはキャンセルされ、ajaxはエラーで完了しますが、401コードがありません。接続が切断されたか、同等の下位層の問題であるかのように見えます。
このCORSの警告について具体的に言及している、私が見た唯一のWebサイトは[1]です。
閲覧者は、エラーが発生したときに何がうまくいかなかったかを報告するという良い仕事をしていません。たとえば、Firefoxはすべてのエラーについてステータス0と空のstatusTextを報告します。ブラウザもコンソールログにエラーメッセージを報告しますが、JavaScriptからこのメッセージにアクセスすることはできません。onerrorを処理すると、エラーが発生したことがわかりますが、それ以外はあまりありません。
chrome起動フラグを使用してこのセキュリティを無効にすることができます-バックエンドが「正常に」機能していることと、適切なステータスコードの損失によって1つの健全性が過度に影響を受けていないことの両方をテストするためだけです。[2]を参照してください
問題
バックエンドとフロントエンドのクライアントコードが認証プロセスの一部として401を使用することになっている場合はどうなりますか?-障害はすべて、1つの「エラー」出力にまとめられます。
例:認証要求を発行すると(たとえば、2本足のOAuthトークン要求-RESTfulバックエンドに対して-適切なステータスコードを使用します-クライアントは次のことを認識しません。
- 401ユーザーが認証されていません。
- ---接続に失敗しました。
- 400悪いリクエストがありました。
- 500サーバーに問題があります。
- 207成功した後は内容がありませんでした。
当時費用対効果が高いと見なされたのと同じくらい多くのベストプラクティスに従って、非常にRESTfulに作成されたバックエンド。これらの1つは、適切なHTTPステータスコードに依存していました。私たちが取り組んでいるJavaRESTクライアントはうまく機能しました。
今、私はWebページに埋め込むためのJavascriptクライアントの作成を開始しました-特にCORSを使用して、Chromeなどで問題が発生しました(Firefoxは問題ないようで、現在はIEを気にしません)。
質問
これらの問題を回避するために人々は何をしましたか?
CORSを信頼できるバックエンドにより適したものにするためにできることはありますか?
リンク
- CORSチュートリアル:http ://www.html5rocks.com/en/tutorials/cors/
- Chromeは、リソースに対して401トリガーの認証プロンプトを許可しません:http ://code.google.com/p/chromium/issues/detail?id = 81251
- --disable-web-security for Chrome:Chromeで同一生成元ポリシーを無効にします