/ /リダイレクトされたCORSリクエストが失敗するのはなぜですか? --angularjs、cors

リダイレクトされたCORS要求が失敗するのはなぜですか? - 角度、コア

私の問題は、localhost:8080で実行されているアプリでのangularjs $ http呼び出しにあります

var url "https://api.acme.com/RX/v1/user";
$http.get(url).success(function (data) {
alert("yay");
$scope.user = data;
});

最初のリクエストは成功し、Chromeによって記録された次のレスポンスが表示されます。

Status Code:302 Found
Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:8080
Location:https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser

これにより、ブラウザはリダイレクト場所に2番目のGETリクエストを送信します。

https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser

この2番目のリクエストは失敗し、Chromeで次のエラーが報告されます。

XMLHttpRequest cannot load https://login.acme.com/cas/login?service=https%3A%2F%2Fapi.acme.com%2FRX%2Fv1%2Fuser. No "Access-Control-Allow-Origin" header is present on the requested resource. Origin "null" is therefore not allowed access.

だから私はオリジンからURLへのCORSリクエストを持っていますこれにより、リクエストを許可するように構成されている別のURLにリダイレクトされているリクエストが許可されます。しかし、リダイレクト要求は失敗しています。これが機能することを期待する必要がありますか?

api.acme.comとlogin.acme.comはどちらも、を使用するすべてのオリジンを許可するように構成されていることに注意してください。

Access-Control-Allow-Origin: *

回答:

回答№1は2

この問題は、ブラウザが302がXHRリクエストから戻ってきたときに、オリジンがnullになります。余談ですが、これは私には奇妙に思えます。確かに、302をnullではなく元のOriginで作成する方が理にかなっているからです。

Origin nullがサーバーに到着すると、そこでのapache tomcat CORS実装(http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter、tomcat 7.0.52)は、サーバーがすべてのオリジンを許可するように構成されている場合でも、Access-Control-Allow-Originヘッダーを返しません。 注意:この動作は、Tomcat7の現在のバージョンで修正されています。

解決策は、サーバーで別のCORS実装を使用することでした(http://software.dzhuvinov.com/cors-filter.html)。このフィルターはAccess-Control-Allow-Origin:nullを返し、302XHRは成功します。

私は解決策を見つけましたが、私はまだ2つのことを確信していません:

  1. XHRでリダイレクトが発生したときにブラウザがOriginnullを送信する理由
  2. TomcatフィルターまたはdzhuvinovソフトウェアフィルターがOriginnullに正しく応答しているかどうか。

回答№2の場合は1

このセクション(7.1.7)のステップ6を参照してください。 http://www.w3.org/TR/cors/#redirect-steps

詳細については、こちらをご覧ください。 https://code.google.com/p/chromium/issues/detail?id=154967

残念ながら、文字列「null」を送信するという慣習により、バグのように見えます。私はこれを追跡するまで自分でそう思った:)


回答№3の場合は0

LoginRequiredMiddlewareを使用する場合は、必ずsettings.pyのLOGIN_EXEMPT_URLSにURLを追加してください。