WebSocket 通信プロトコルには、認証メカニズムが組み込まれていません。 WebSocket接続ではHTTPミドルウェアを使用した認証を実装する必要があります。この記事の目的は、WebSocket 接続を認証する方法を確立し、考えられる戦略とその実装を特定することです。
この戦略には、カスタム ヘッダーを使用して接続のアップグレードを保護することが含まれます。ミドルウェア経由で「X-Api-Key」として。一致するキーで会話を開始したクライアントのみがアップグレードされます。ただし、クライアントの最初の GET リクエストは HTTP 経由であるのに対し、後続のアップグレード リクエストは WebSocket 経由であるため、質問で提供されているコードは失敗し、サーバー側で不一致が発生します。
この問題を修正するには、認証された WebSocket ハンドシェイク。 Dial 関数の最後の引数に認証ヘッダーを含めます。
<code class="go">func main() { u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"} conn, _, err := websocket.DefaultDialer.Dial(u.String(), http.Header{"X-Api-Key": []string{"test_api_key"}}) if err != nil { log.Fatalf("dial err: %v", err) } err = conn.WriteMessage(websocket.TextMessage, []byte("hellow websockets")) if err != nil { log.Fatalf("msg err: %v", err) } }</code>
説明されている戦略 2 については詳しく説明されていませんが、これには、 WebSocket 接続が確立された後のクライアント。クライアントはユーザー名とパスワードを送信する必要があり、サーバーはそれを検証します。不一致の場合、接続は終了します。このアプローチには、さらなる明確化と実装の提案が必要になる場合があります。
サーバー側では、HTTP リクエスト認証用のアプリケーションのコードを使用して、WebSocket ハンドシェイクも認証します。この認証ロジックを HTTP ミドルウェアに統合します。
このアプローチにより、クライアントは WebSocket プロトコルを使用して認証し、HTTP リクエストに実装されている既存の認証メカニズムを利用できるようになり、通信チャネル全体で一貫した安全な認証エクスペリエンスが提供されます。
以上がHTTP ミドルウェアを使用して WebSocket 接続を認証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。