ドメイン間でリダイレクトして Cookie またはヘッダーを設定するにはどうすればよいですか?
あるドメインから別のドメインにリダイレクトし、他のドメインに Cookie またはヘッダーを設定するにはどうすればよいですか?
ここで説明されているように、カスタム ヘッダーが設定された別のドメインにリダイレクトすることはできません。どのような言語やフレームワークを使用しているかは関係ありません。 HTTP プロトコルのリダイレクトは基本的に応答に関連付けられたヘッダー (つまり、場所) であり、ターゲットの場所へのヘッダーを追加することはできません。例に Authorization ヘッダーを追加する場合、基本的にそのヘッダーは、リダイレクト自体ではなく、ブラウザーにリダイレクトするように指示する応答に設定されます。言い換えると、そのヘッダーをクライアントに送り返します。
HTTP Cookie に関しては、ブラウザはサーバーから応答とともに送信された Cookie を (Set-Cookie を使用して) 保存します。ヘッダー))、その後、Cookie HTTP ヘッダー内の 同じサーバー に対して行われたリクエストとともに Cookie を送信します。ドキュメントによると:
Set-Cookie HTTP 応答ヘッダーは、
サーバーからユーザー エージェントに Cookie を送信するために使用され、ユーザー エージェントがそれをサーバーに送り返すことができます
後で。複数の Cookie を送信するには、複数の Set-Cookie
ヘッダーを同じ応答で送信する必要があります。
したがって、これが 1 つのアプリからのリダイレクト (サブドメイン、例: abc.example.test) の場合、 ) 両方とも同じ (親) ドメインを持つ別の (サブドメイン、例: xyz.example.test) に送信すると (Cookie の作成時にドメイン フラグが example.test に設定されている)、Cookie はそれらの間で正常に共有されます。 2 つのアプリ (ドメインが指定されているかのように、サブドメインが常に含まれます)。ブラウザは、使用されているプロトコル (HTTP/HTTPS) またはポートに関係なく、サブドメインを含む指定されたドメインで Cookie を利用できるようにします。ドメイン フラグとパス フラグを使用して Cookie の利用を制限したり、secure フラグや httpOnly フラグを使用して Cookie へのアクセスを制限したりできます (こちらとこちら、および Starlette のドキュメントを参照してください)。 httpOnly フラグが設定されていない場合、潜在的な攻撃者は JavaScript (JS) を通じて情報を読み取り、変更することができますが、httpOnly 属性を持つ Cookie はサーバーにのみ送信され、クライアント側の JS にはアクセスできません。
ただし、別のドメインに Cookie を設定することはできません。これが許可されると、セキュリティ上、重大な欠陥が生じることになります。したがって、"Cookie を設定してあるアプリケーション (ドメイン) から別のアプリケーション (ドメイン) にユーザーをリダイレクトしようとしているため、...*""、Cookie は送信されるだけであるため、機能しません。 同じドメインに対してリクエストが行われた場合。
解決策 1
ここで説明する解決策は、URL にクエリ パラメータとして渡されたアクセス トークンを使用して、ドメイン (アプリ) A がユーザーをドメイン (アプリ) B にリダイレクトすることです。次に、ドメイン B はトークンを読み取り、独自の Cookie を設定します。これにより、ブラウザはその Cookie を保存し、その後のドメイン B へのリクエストごとにその Cookie を送信します。
安全な (HTTPS) 通信の使用を検討する必要があることに注意してください。 、トークンが暗号化されて転送されるようにするだけでなく、Cookie の作成時にセキュア フラグを設定します。また、機密データはクエリ文字列で渡されるべきではないため、クエリ文字列にトークンを含めることは重大なセキュリティ リスクを引き起こすことにも注意してください。これは、URL の一部であるクエリ文字列がブラウザのアドレス バーに表示されるためです。これにより、ユーザーはトークンが含まれる URL を表示してブックマークできるようになります (つまり、トークンはディスクに保存されます)。また、URL は閲覧履歴に残ります。つまり、いずれにしてもディスクに書き込まれ、[履歴] タブに表示されます (ブラウザの履歴を表示するには、Ctrl H を押します)。上記の両方により、攻撃者 (およびコンピュータ/モバイル デバイスを共有する人々) がそのような機密データを盗むことが可能になります。さらに、多くのブラウザ プラグイン/拡張機能はユーザーの閲覧アクティビティを追跡します。悪意のある Web サイトを検出して事前に警告するために、アクセスしたすべての URL が分析のためにサーバーに送信されます。したがって、以下のアプローチを使用する前に、上記のすべてを考慮する必要があります (この主題に関する関連記事については、ここ、ここ、およびここを参照してください)。
アドレス バーに URL が表示されないようにするには、以下のアプローチを使用します。ドメイン B 内でもリダイレクトを使用します。ドメイン B がクエリ パラメーターとしてトークンを含む /submit ルートへのリクエストを受信すると、ドメイン B はトークンが含まれていない裸の URL (つまり、そのホームページ) へのリダイレクトで応答します。このリダイレクトにより、トークンが含まれる URL は閲覧履歴に残りません。これにより、前述した特定の攻撃に対するある程度の保護が提供されますが、ブラウザ拡張機能などがトークンを含む URL をキャプチャできないという意味ではありません。
これをテストしている場合ローカルホストでは、アプリケーション B に別のドメイン名を与える必要があります。そうしないと、前述したように、同じドメインを持つアプリケーション間で Cookie が共有されるため、ドメイン A に設定された Cookie を受け取ることになり、このアプローチが機能しているかどうかがまったくわかりません。これを行うには、/etc/hosts ファイル (Windows では C:WindowsSystem32driversetc にあります) を編集し、ホスト名を 127.0.0.1 に割り当てる必要があります。例:
127.0.0.1 example.test
スキームやポートをドメインに追加しないでください。また、.com、.net などの一般的な拡張子も使用しないでください。そうしないと、競合する可能性があります。インターネット上の他の Web サイトにアクセスする場合。
以下のドメイン A にアクセスしたら、送信ボタンをクリックして /submit ルートへの POST リクエストを実行し、リダイレクトを開始する必要があります。 POST リクエストの唯一の理由は、例で POST リクエストを使用しており、フォームデータを投稿する必要があると想定しているためです。それ以外の場合は、GET リクエストを使用することもできます。アプリ B では、POST ルート (/submit) から GET ルート (/) への RedirectResponse を実行すると、ここ、ここ、およびここで説明されているように、応答ステータス コードが status.HTTP_303_SEE_OTHER に変わります。アプリ A はポート 8000 でリッスンし、アプリ B はポート 8001 でリッスンします。
以下の両方のアプリを実行し、http://127.0.0.1:8000/ でドメイン A にアクセスします。
appA.py
127.0.0.1 example.test
appB.py
<code class="python">from fastapi import FastAPI, FastAPI from fastapi.responses import RedirectResponse, HTMLResponse import uvicorn app = FastAPI() @app.get('/', response_class=HTMLResponse) def home(): return """" <!DOCTYPE html> <html> <body> <h2>Click the "submit" button to be redirected to domain B</h2> <form method="POST" action="/submit"> <input type="submit" value="Submit"> </form> </body> </html> """ @app.post("/submit") def submit(): token = 'MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3' redirect_url = f'http://example.test:8001/submit?token={token}' response = RedirectResponse(redirect_url) response.set_cookie(key='access-token', value=token, httponly=True) # set cookie for domain A too return response if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=8000)</code>
解決策 2
もう 1 つの解決策は、Window オブジェクト間のクロスオリジン通信を可能にする Window.postMessage() を使用することです。たとえば、ページとそれが生成したポップアップの間、またはページとその中に埋め込まれた iframe の間などです。イベント リスナーを追加し、ウィンドウ間で通信する方法の例は、ここにあります。実行する手順は次のとおりです:
ステップ 1: ドメイン A に非表示の iframe をドメイン B に追加します。例:
<code class="python">from fastapi import FastAPI, Request, status from fastapi.responses import RedirectResponse import uvicorn app = FastAPI() @app.get('/') def home(request: Request): token = request.cookies.get('access-token') print(token) return 'You have been successfully redirected to domain B!' \ f' Your access token ends with: {token[-4:]}' @app.post('/submit') def submit(request: Request, token: str): redirect_url = request.url_for('home') response = RedirectResponse(redirect_url, status_code=status.HTTP_303_SEE_OTHER) response.set_cookie(key='access-token', value=token, httponly=True) return response if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0', port=8001)</code>
ステップ 2 :
から認可トークンを取得するとすぐに以上がドメイン間でリダイレクトして Cookie またはヘッダーを設定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Pythonは学習と使用が簡単ですが、Cはより強力ですが複雑です。 1。Python構文は簡潔で初心者に適しています。動的なタイピングと自動メモリ管理により、使いやすくなりますが、ランタイムエラーを引き起こす可能性があります。 2.Cは、高性能アプリケーションに適した低レベルの制御と高度な機能を提供しますが、学習しきい値が高く、手動メモリとタイプの安全管理が必要です。

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

PythonとCにはそれぞれ独自の利点があり、選択はプロジェクトの要件に基づいている必要があります。 1)Pythonは、簡潔な構文と動的タイピングのため、迅速な開発とデータ処理に適しています。 2)Cは、静的なタイピングと手動メモリ管理により、高性能およびシステムプログラミングに適しています。

PythonListSarePartOfThestAndardarenot.liestareBuilting-in、versatile、forStoringCollectionsのpythonlistarepart。

Pythonは、自動化、スクリプト、およびタスク管理に優れています。 1)自動化:OSやShutilなどの標準ライブラリを介してファイルバックアップが実現されます。 2)スクリプトの書き込み:Psutilライブラリを使用してシステムリソースを監視します。 3)タスク管理:スケジュールライブラリを使用してタスクをスケジュールします。 Pythonの使いやすさと豊富なライブラリサポートにより、これらの分野で優先ツールになります。

科学コンピューティングにおけるPythonのアプリケーションには、データ分析、機械学習、数値シミュレーション、視覚化が含まれます。 1.numpyは、効率的な多次元配列と数学的関数を提供します。 2。ScipyはNumpy機能を拡張し、最適化と線形代数ツールを提供します。 3. Pandasは、データ処理と分析に使用されます。 4.matplotlibは、さまざまなグラフと視覚的な結果を生成するために使用されます。
