29

ユーザーが(トークンを使用して)認証できるようにし、同じドメイン内にリダイレクトを含む API を設計しています。ここで、303 を返すエンドポイントへの認証されていないリクエストの場合、

GET /documents/123  --> 303 redirect to `/documents/abc`
GET /documents/abc  --> 200

すべてがうまくいきます。

Authorizationヘッダーが送信されるのと同じエンドポイントに対して認証済みのリクエストを行いましょう。これにより、リクエストがプリフライト リクエストになり、ブラウザはプリフライトOPTIONSリクエストを実行します。

OPTIONS /documents/123   --> 204 (everything okay, please proceed)
GET /documents/123       --> 303 redirect to `/documents/abc`

この時点で、ブラウザはGETで実際のリソースを ting する代わりに、/documents/abc

XMLHttpRequest cannot load http://localhost:8000/people/username/nschloe. 
The request was redirected to 'http://localhost:8000/people/YDHa-B2FhMie', 
which is disallowed for cross-origin requests that require preflight.

この動作は標準に従っています:

7.1.5 プリフライトを使用したクロスオリジン リクエスト

応答の HTTP ステータス コードが 2xx の範囲にない場合

ネットワーク エラーの手順を適用します。

これは、リダイレクトが同じドメイン上にある場合でも、認証されたリソースのリダイレクトを実行できないことを意味しているようです( localhost)。

これは本当に真実でしょうか?一般的な回避策はありますか?

4

1 に答える 1

18

元の標準では、CORS プリフライトが成功した後のリダイレクトは禁止されています。§ 7.1.5.3 の引用:

これが実際の要求です。リクエストを作成する手順を適用し、リクエストを作成する際に以下のリクエスト ルールを遵守してください。

  • 応答の HTTP ステータス コードが 301、302、303、307、または 308 の場合 キャッシュおよびネットワーク エラーの手順を適用します。

皆さんの努力 (ありがとう!) により、2016 年 8 月 4 日に標準が更新され、CORS プリフライト チェックが成功した後にリダイレクトできるようになりました。

ブラウザが追いつくまで、実行可能な唯一のオプションは、次のいずれかまたは組み合わせのようです。

  1. 単純なリクエストに対してのみリダイレクトを発行します。
  2. ヘッダーに独自の URL を「プロキシ」として指定して、 305 リダイレクトを発行します。Location305 は非推奨であるため、ブラウザのサポートが制限されていることに注意してください。
  3. 偽の「リダイレクト」を行います。
  • meta refreshおよび/または Javascriptを変更して HTML を返しますLocation
  • iframeリダイレクト ターゲットを iframe のソースとするビューポート フィリングを持つ HTML を返します。
  • ユーザーがコンテンツにアクセスするためにクリックする必要があるリンクを表示します。
于 2016-09-27T15:10:13.390 に答える