14

WebSocket クライアントが WebSocket サーバーへの初期接続に関する追加情報を送信する方法はありますか?

クライアントにユーザーID(文字列)をサーバーにすぐに送信してもらいたいのでお願いしています。クライアントが onopen コールバックでユーザー ID を送信しないようにします。なんで?その方が速くて簡単だからです。

WebSocket API でこれができないとしたら、それはなぜでしょうか? 正当な理由がない場合、この単純な機能を追加することをどのように提案できますか?

4

2 に答える 2

11

更新された回答

@dandavisは天才です。WebSocket コンストラクターの最初の (url) 引数のクエリ文字列でユーザー ID を送信するという質問に対する彼のコメントは機能します! そして、 WebSocket プロトコル (RFC 6455)の開始ハンドシェイク (1.3) 中にクライアントによって一度だけ送信されると確信しています。

私が作成したWebSocketサーバーはWebSocket専用であるため、パスで送信することもできました。wsでNode.jsを使用しています。URLに接続しています。 はユーザー ID です。ユーザー ID を取得するには、次のようにします。ws://localhost:5000/44ws.upgradeReq.url

wss.on('connection', function(ws) {
    console.log(ws.upgradeReq.url); # => '/4'
});

次に、セキュリティを確保するために、ユーザー ID の代わりにアクセス トークンを渡します。

元の回答

WebSocket コンストラクターの 2 番目の (プロトコル) 引数としてユーザー ID (文字列) を渡すことができます。

それはうまくいくはずですが、あなたが望むものではありません。それは間違いなくハックです。だから、私はそれをお勧めしません。また、サーバーはハンドシェークでユーザー ID をクライアントにエコー バックします。そして、あなたはそれを必要としません。それは、あなたにとって何の役にも立たない余分なデータが送信されることになります。

なぜ WebSocket API でやりたいことができないのか、私にはわかりません。その方が安全かもしれません。

于 2013-10-19T02:04:17.407 に答える
1

v3ws.upgradeReqは廃止されたため、もう機能しません。

以下を使用できるようになりました。

wss.on('connection', function(ws, req) {
    console.log(req.url); # => '/4'
});

ソース: https://github.com/websockets/ws#client-authentication

于 2020-04-28T20:02:20.377 に答える