web-dev-qa-db-ja.com

WebSocketハンドシェイクでセッションデータを使用する

ログオンしているユーザーがWebSocketを使用するサイトの特定の領域に移動した場合、そのセッションIDを取得してサーバー上で特定できるようにするにはどうすればよいですか?

私のサーバーは基本的に無限のwhileループであり、接続されているすべてのユーザーとものに関する情報を保持しているため、そのidを取得するために、適切な瞬間はハンドシェイクであると考えましたが、残念ながらハンドシェイクのリクエストヘッダーにはcookieデータが含まれていません。

リクエストヘッダー

受け入れる:text/html、application/xhtml + xml、application/xml; q = 0.9、/; q = 0.8
Accept-Encoding:gzip、deflate Accept-Language:en-US、en; q = 0.5
キャッシュ制御:キャッシュなし
接続:キープアライブ、アップグレード
DNT:1
ホスト:192.168.1.2:9300
起源:http://localhost
プラグマ:キャッシュなし
Sec-WebSocket-Key:5C7zarsxeh1kdcAIdjQezg ==
Sec-WebSocket-Version:13
アップグレード:websocket
ユーザーエージェント:Mozilla/5.0(Windows NT 6.1; WOW64; rv:27.0)Gecko/20100101 Firefox/27.0

では、どうすればそのIDを実際に取得できますか?どういうわけかjavascriptにその要求と共にcookieデータを送信させることができると思いましたが、2014年の自尊心のあるWebサイトにはhttpOnlyセッションcookieがあり、うまくいきません。どんな助けでも大歓迎です!

ここに私が使用しているサーバーのファイルのダウンロードリンクがあります http://www.4shared.com/rar/7RIos1tuce/PHPWebSocket-Chat-master.html

20
php_nub_qq

安全なcookieと同様にhttpのみのcookieは、websocketで正常に機能します。

一部のWebSocketモジュールは、リクエスト内のCookieを無視することを選択しているため、モジュールの仕様を読む必要があります。

試してください:websocketノード: https://github.com/Worlize/WebSocket-Node

Wss://xyz.comとして安全なwebsocketプロトコルを使用してください

更新:

また、chromeはを行いませんと、「要素の検査」の[ネットワーク]タブにCookieを表示します。

ノードで次のようなリクエストをダンプしてみてください:

 wsServer.on('request', function(request) {
   console.log(request);
   console.log(request.cookies); // works in websocket node
 }

ログのどこかにCookieが表示された場合は、それがわかります。

安全な専用Cookieを使用している場合は、安全なWebソケットにいる必要があります:wss://

Update2:

Cookieは最初のリクエストで渡されます。 Chromeは、(常に)Cookie情報を省略した暫定ヘッダーを表示するため、常に表示しません。

Cookieで「何か」を行い、それらを各リクエストに添付するのは、WebSocketサーバーの責任です。

サーバーのコードを見る: https://github.com/Flynsarmy/PHPWebSocket-Chat/blob/master/class.PHPWebSocket.php 「cookie」という単語がどこにも表示されないので、うまくパッケージ化されておらず、各WebSocket接続に接続されていません。私は間違っている可能性があります。そのため、開発者に連絡して、ヘッダー全体が各接続にアタッチされているかどうか、およびそれにアクセスする方法を確認する必要があります。

これは確かです。安全なCookieを使用している場合、安全なWebソケットwss://mysite.comを使用しない限り、Cookieは送信されません。プレーンws://mysite.comは機能しません。

また、ドメインがウェブページと同じ場合、Cookieはリクエストでのみ送信されます。

16
Brian McGinity