HTTP ミドルウェアによる WebSocket 接続の認証
WebSocket 接続は、クライアントとサーバー間のリアルタイム通信の手段を提供します。ただし、HTTP リクエストとは異なり、WebSocket は本質的に認可や認証をサポートしません。これに対処するために、HTTP ミドルウェアを使用して WebSocket 接続を保護できます。
問題ステートメント
一般的なアプローチの 1 つは、HTTP を認証するためのアプリケーションのコードを使用してアップグレード ハンドシェイクを認証することです。リクエスト。ただし、Gorilla の WebSocket アップグレーダーを使用して Golang でこのアプローチを実装するのは困難であることがわかっています。
コミュニティからの提案
コミュニティからの提案には次のものがあります。
失敗した戦略
失敗した戦略には、カスタム ヘッダー (「X-Api」の追加が含まれていました) -Key") を最初の HTTP GET リクエストに追加し、一致するキーを持つクライアントのみをアップグレードします。ただし、これにより、サーバー上で「アップグレード」トークンが見つからないというエラーが発生し、クライアントが WebSocket プロトコルを利用できなくなりました。
戦略 1 の改善されたソリューション
戦略 1 を改善すると、認証は WebSocket ハンドシェイク自体で実行される必要があります。これは、クライアント コードで認証ヘッダーを Dial の最後の引数として渡すことで実現できます。
<br>func main() {</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"} headers := http.Header{"X-Api-Key": []string{"test_api_key"}} conn, _, err := websocket.DefaultDialer.Dial(u.String(), headers) if err != nil { log.Fatalf("dial err: %v", err) }
}
サーバー側では、ハンドシェイク プロセス中に HTTP リクエストを認証するためのアプリケーションの既存のコードを使用して認証を実行する必要があります。これにより、クライアントが承認されている場合にのみ WebSocket 接続が確立されるようになります。
以上がHTTP ミドルウェアはどのようにして Golang で WebSocket 接続を保護できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。