質問

Expressフレームワークを使用しています。 socket.ioからセッションデータに到達したいと思います。 client.listener.server.dynamicviewhelpersデータを使用してExpress Dynamichelpersを試してみましたが、セッションデータは取得できません。これを行う簡単な方法はありますか?コードをご覧ください

app.listen(3000);

var io = require('socket.io');
var io = io.listen(app);

io.on('connection', function(client){
    // I want to use session data here
    client.on('message', function(message){
        // or here
    });
    client.on('disconnect', function(){
        // or here
    }); 
});
役に立ちましたか?

解決

これは、FlashSocket Transportを使用するソケットでは機能しません(必要なCookieをサーバーに送信することはありません)が、他のすべてに確実に機能します。コード内のFlashSocket Transportを無効にするだけです。

Express/Connect側で機能させるために、セッションストアを明示的に定義して、ソケット内で使用できるようにします。

MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
  app.use(express.session({ store: session_store }));
});

次に、ソケットコード内に接続フレームワークを含めて、Cookieの解析を使用してCookie.sidを取得できるようにします。次に、Connect.sidを持っているセッションストアでセッションを調べます。

var connect = require('connect');
io.on('connection', function(socket_client) {
  var cookie_string = socket_client.request.headers.cookie;
  var parsed_cookies = connect.utils.parseCookie(cookie_string);
  var connect_sid = parsed_cookies['connect.sid'];
  if (connect_sid) {
    session_store.get(connect_sid, function (error, session) {
      //HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
    });
  }
});

その後、必要に応じてセッションを使用できます。

他のヒント

socket.io-sessionsモジュールソリューションは、クライアント(スクリプト)レベルでセッションIDを公開することにより、アプリをXSS攻撃に公開します。

これをチェックして 解決 代わりに(socket.io> = v0.7の場合)。ドキュメントを参照してください ここ.

ホイールを完全に再発明しないことをお勧めします。必要なツールはすでにNPMパッケージです。これが必要なものだと思います。 session.socket.io私は最近それを使用しています、そしてそれは私が推測する非常に役立つでしょう!! Express-Sessionをsocket.ioレイヤーにリンクするには、非常に多くの利点があります!

編集: うまくいかなかったいくつかのモジュールを試した後、私は実際にこれを行うために自分のライブラリを書きました。恥知らずなプラグ:チェックしてください https://github.com/aviddiviner/socket.io-sessions. 。歴史的な目的のために以下の古い投稿を残します。


私はこの仕事を非常にきれいに手に入れました FlashSocket 通りの輸送 PR0ZAC上記の解決策。また、Socket.ioでExpressを使用しています。これが方法です。

まず、セッションIDをビューに渡します。

app.get('/', function(req,res){
  res.render('index.ejs', {
    locals: { 
      connect_sid: req.sessionID
      // ...
    }
  });
});

次に、あなたの見解では、socket.ioクライアント側にリンクします。

<script>
  var sid = '<%= connect_sid %>';
  var socket = new io.Socket();
  socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>

次に、サーバー側のsocket.ioリスナーで、それを拾ってセッションデータを読み取り/書き込みます。

var socket = io.listen(app);
socket.on('connection', function(client){
  client.on('message', function(message){
    session_store.get(message.sid, function(error, session){
      session.pings = session.pings + 1 || 1;
      client.send("You have made " + session.pings + " pings.");
      session_store.set(message.sid, session);  // Save the session
    });
  });
});

私の場合、私の session_store Redisは、を使用しています redis-connect 図書館。

var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));

これがGoogleを検索中にこの投稿を見つけた人を助けることを願っています(私がしたように)

これを参照してください: socket.io認証

私は何もフェッチしないことをお勧めします client.request... また client.listener... それはに直接添付されていないため client オブジェクトし、常にログインしたユーザーを指してください!

チェックアウト socket.io-connect

socket.io-nodeの周りにWebsocket Middlewareラッパーを接続しますhttps://github.com/bnoguchi/socket.io-connect

これにより、socket.ioイベントハンドラーで処理する前に、Socket.ioリクエストをExpress/Connect Middlewareスタックを押し下げることができ、セッション、Cookieなどにアクセスできます。ただし、すべてのsocket.ioのトランスポートで動作するかどうかはわかりません。

あなたはそれを利用することができます Express-socket.io-session .

socket.ioとクッキーベースのエクスプレスセッションミドルウェアを共有します。 Express> 4.0.0およびsocket.io> 1.0.0で動作し、後方互換性がありません。

私のために働いた!

あなたはこれを見ることができます: https://github.com/bmeck/session-web-sockets

または、使用することもできます。

io.on('connection', function(client) { 
  var session = client.listener.server.viewHelpers; 
  // use session here 
});

お役に立てれば。

私がそれを正しくやっているかどうかはわかりません。https://github.com/learnboost/socket.io/wiki/authorizing

握手データを使用すると、Cookieにアクセスできます。また、Cookieでは、各クライアントのセッションIDであるConnect.SIDをつかむことができます。次に、connect.sidを使用してデータベースからセッションデータを取得します(Redisstoreを使用していると仮定しています)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top