1. ホーム
  2. ジャバスクリプト

[解決済み】WebsocketクライアントAPIのHTTPヘッダーについて

2022-04-17 19:12:51

質問

ウェブソケットクライアントにカスタムHTTPヘッダーを追加するには、これをサポートするHTTPヘッダークライアントを使用すると簡単なようですが、JSON APIでそれを行う方法を見つけることができません。

それでも、サポートがあるはずだと思われる これらのヘッダは仕様に .

どなたか、実現するための手がかりをお持ちの方はいらっしゃいませんか?

var ws = new WebSocket("ws://example.com/service");

具体的には、HTTP Authorizationヘッダを送信できるようにする必要があります。

どのように解決するのですか?

2回目の更新

簡潔にお答えします。 いいえ、指定できるのはpathとprotocolのフィールドのみです。

回答が長くなりました。

JavaScript にはメソッドはありません。 ウェブソケットAPI クライアント/ブラウザが送信する追加ヘッダを指定するためのものです。HTTP パス ("GET /xyz") とプロトコル ヘッダー ("Sec-WebSocket-Protocol") は、WebSocket のコンストラクタで指定できます。

Sec-WebSocket-Protocol ヘッダー (ウェブソケット固有の認証で使用するために拡張されることがあります) は、ウェブソケットコンストラクタのオプションの第 2 引数から生成されます。

var ws = new WebSocket("ws://example.com/path", "protocol");
var ws = new WebSocket("ws://example.com/path", ["protocol1", "protocol2"]);

上記の結果、ヘッダーは以下のようになります。

Sec-WebSocket-Protocol: protocol

そして

Sec-WebSocket-Protocol: protocol1, protocol2

WebSocket 認証/認可を実現するための一般的なパターンは、WebSocket クライアントをホストするページがサーバーにチケットを要求し、WebSocket 接続設定中に URL/クエリ文字列、プロトコルフィールド、または接続確立後の最初のメッセージとして必要なこのチケットを渡す、チケットシステムを実装することです。サーバーは、チケットが有効である場合(存在する、まだ使用されていない、チケットにエンコードされたクライアント IP が一致する、チケットのタイムスタンプが新しい、など)だけ接続を続行します。以下に、WebSocket のセキュリティ情報をまとめます。 https://devcenter.heroku.com/articles/websocket-security

以前はBasic認証がオプションとしてありましたが、これは非推奨となり、最近のブラウザでは指定されてもヘッダーは送信されません。

基本認証情報 (非推奨 - 機能停止中) :

注:以下の情報は、どのモダンブラウザでも正確ではなくなりました。

Authorizationヘッダーは、WebSocket URIのユーザー名とパスワード(またはユーザー名のみ)フィールドから生成されます。

var ws = new WebSocket("ws://username:[email protected]")

上記の結果、文字列 "username:password" がbase64エンコードされた以下のヘッダが生成されます。

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

Chrome 55とFirefox 50でBasic Authをテストし、Basic Auth情報が確かにサーバとネゴシエートされることを確認しました(Safariではうまくいかないかもしれません)。

Dmitry Frank's の基本認証に感謝します。 回答