チャット アプリケーションの 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:
0.0.0.0
と localhost
の間で共有されません。 http://localhost:8080
と http://localhost:8081
の間で共有できます。 http://localhost:8080/
ページから http://localhost:8081/
に送信されたリクエストは、クロスドメイン リクエストとみなされます。 fetch
送信されるクロスオリジン リクエストは、ブラウザが Cookie を保存できるように、credentials: 'include'
で初期化する必要があります。 har は、Web ページの URL が http://localhost:8080/
であるが、ログイン エンドポイントが http://0.0.0.0:8081/login
であることを示しています。 。 0.0.0.0
の Cookie は localhost
と共有されません。
次のデモを実行して動作を観察できます:
デモを実行します: main.go を実行します
;
ブラウザで http://localhost:8080/
を開きます。このページでは次のことを行います:
http://0.0.0.0:8081/login1
に送信します (目的は、0.0.0.0
の Cookie が ## と共有されていないことを確認することです。 #ローカルホスト ;
に送信します (目的は、セッション Cookie が
http://localhost:8080 と の間にあることを確認することです。
http:///localhost:8081 間で共有;
に送信します (目的は、通常の Cookie が
http://localhost:8080 との間で送信されることを確認することです。
http:////localhost:8081;
間で共有
に移動し、サーバーはリクエストをダンプします。このヘッダーがサーバーに送信されることを示します:
cookie:login2=localhost-session;login3=localhost。
コメント: credentials: 'include' では、
access-control-allow-origin ヘッダーを正確なオリジンに設定する必要があります (## を意味します) #*
は拒否されます)。access-control-allow-credentials
ヘッダーは true
に設定されます。
リーリー
以上がGo チャット アプリケーションでローカルホスト ポート間で Cookie が転送されないことを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。