ホームページ > バックエンド開発 > Golang > Go チャット アプリケーションでローカルホスト ポート間で Cookie が転送されないことを解決するにはどうすればよいですか?

Go チャット アプリケーションでローカルホスト ポート間で Cookie が転送されないことを解決するにはどうすればよいですか?

王林
リリース: 2024-02-05 22:39:11
転載
1219 人が閲覧しました

如何解决 Go 聊天应用程序中 cookie 未在本地主机端口之间传输的问题?

質問の内容

チャット アプリケーションの Cookie ベースのトークン認証に問題があります。標準ネットワーク ライブラリで go バックエンドを使用して、応答 cookie にトークンを追加しています。ユーザーが (認証サーバー上の /login パスへのポストを通じて) パスワード認証されると、応答 Cookie には、API トークンの生成に使用されるアクセス トークンと、アクセス トークンの再生成に使用されるリフレッシュ トークンが含まれている必要があります。

これは、開発環境のアプリケーション サービスの構造を含むマークアップ ファイルです。各サーバーは、順次ポートで go net/http を使用して localhost 上で実行されます (関連しないサービスは表示されていません)。

リーリー

これはログイン時に Cookie を設定するコードです。これはパスワードチェック後に発生します

リーリー リーリー

ユーザーが API トークンをリクエストしたときに Cookie にアクセスする方法は次のとおりです。エラーが返された場合、ハンドラーは gettokenfromcookie() 関数を呼び出し、401 で応答します。この場合のエラーは、「http: 指定された Cookie が存在しません」です。

リーリー

ログイン エンドポイントからの 200 応答の後、ページはメイン アプリケーション ページにリダイレクトされます。このページでは、ライブ チャット メッセージング サーバーへの接続に使用される API トークンを受信するために認証サーバーにリクエストを作成します。認証サーバーのログ出力からわかるように、アクセス トークン Cookie がリクエストで受信されなかったため、リクエストは 401 コードを返しました。

リーリー

localhost を使用していて、ブラウザが Cookie を locahost:8080 から localhost:8081 に転送しないことが問題だと思います。この問題を解決するために、開発環境の Cookie の読み取りをバイパスするある種の偽装認証を実装する予定ですが、それが実際に問題の原因であるかどうかはわかりません。もう一度見て、これを行わずに動作させることができるかどうかを確認したかったのです。

更新: 開発ツールのネットワーク タブを確認しました。 この画像は、ログイン後の応答で Cookie が返されますが、その後ポート 8081 上の認証サーバーに送信されないことを示しています。ログインの 200 応答を取得した後、Cookie ストレージも確認しましたが、その後も応答でそれらを受信する Cookie はありませんでした。 Firefoxのプライベートモードを使用してサイトにアクセスしています。 go コードで maxage を設定しても、Cookie には maxage が含まれていないことに注意してください。これが問題であると思われます。

更新: これはログイン後の har ファイルです。応答には max-age が含まれていることがわかりますが、Cookie タブには表示されません。

リーリー

応答には Cookie が含まれているようですが、保存されていません。

そして、認証サーバーへの次のリクエストでは Cookie は追加されません。


正解


tl;dr:

  1. Cookie は 0.0.0.0localhost の間で共有されません。
  2. セッション Cookie と通常の Cookie の両方を、http://localhost:8080http://localhost:8081 の間で共有できます。
  3. http://localhost:8080/ ページから http://localhost:8081/ に送信されたリクエストは、クロスドメイン リクエストとみなされます。
  4. fetch 送信されるクロスオリジン リクエストは、ブラウザが Cookie を保存できるように、credentials: 'include' で初期化する必要があります。

har は、Web ページの URL が http://localhost:8080/ であるが、ログイン エンドポイントが http://0.0.0.0:8081/login であることを示しています。 。 0.0.0.0 の Cookie は localhost と共有されません。

次のデモを実行して動作を観察できます:

  1. デモを実行します: main.go を実行します;

  2. ブラウザで http://localhost:8080/ を開きます。このページでは次のことを行います:

    1. リクエストを http://0.0.0.0:8081/login1 に送信します (目的は、0.0.0.0 の Cookie が ## と共有されていないことを確認することです。 #ローカルホスト ;
    2. リクエストを
    3. http://localhost:8081/login2 に送信します (目的は、セッション Cookie が http://localhost:8080 と の間にあることを確認することです。 http:///localhost:8081 間で共有;
    4. リクエストを
    5. http://localhost:8081/login3 に送信します (目的は、通常の Cookie が http://localhost:8080 との間で送信されることを確認することです。 http:////localhost:8081; 間で共有
    6. これは
    7. http://localhost:8080/resource に移動し、サーバーはリクエストをダンプします。このヘッダーがサーバーに送信されることを示します: cookie:login2=localhost-session;login3=localhost

コメント: credentials: 'include' では、access-control-allow-origin ヘッダーを正確なオリジンに設定する必要があります (## を意味します) #* は拒否されます)。access-control-allow-credentials ヘッダーは true に設定されます。 リーリー

以上がGo チャット アプリケーションでローカルホスト ポート間で Cookie が転送されないことを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート