1. ホーム
  2. http

[解決済み] Preflightとredirectを使用したCORSリクエスト: 不許可になりました。回避策は?

2022-03-08 22:19:17

質問

ユーザー認証(トークンを使用)が可能で、同一ドメイン内でのリダイレクトを含む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 で実際のリソースを指定します。 /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 以外である場合

ネットワークエラーの手順を適用してください。

これは、1つの はできません。 は、たとえリダイレクト先が同じドメインであっても、認証済みリソースのリダイレクトを行います ( localhost ).

本当にこんなことがあるのでしょうか?一般的な回避策はあるのでしょうか?

解決方法は?

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

これが実際のリクエストです。リクエストの手順を適用し、以下のリクエストルールを守りながらリクエストを行ってください。

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

皆様のご尽力により(ありがとうございます!)、2016年8月4日に規格が 更新 を使用して、CORSプリフライトチェックに成功した後にリダイレクトを許可するようにしました。

ブラウザが追いつくまで、実現可能な選択肢は、1つまたはその組み合わせしかないようです。

  1. に対してのみリダイレクトを発行します。 シンプルリクエスト .
  2. を発行します。 305リダイレクト の中に、自分の URL を入れてください。 Location ヘッダをプロキシとして使用します。305は非推奨であるため、サポートするブラウザが限られていることを覚悟しておいてください。
  3. 偽の "redirect" を実行します。
  • でHTMLを返します。 meta refresh またはJavascript Location を変更します。
  • は、ビューポートを埋め尽くすような HTML を返します。 iframe で、iframe のソースとしてリダイレクト先を指定します。
  • コンテンツにアクセスするためにユーザーがクリックする必要があるリンクを表示します。