7

チャットがあり、固有の接続を管理する必要があります。私は周りを検索しましたが、私が見つけた解決策はすべて廃止されたようです。

では、Socket.IO でソケットのセッション ID を取得するにはどうすればよいでしょうか?

私はNode.jsExpress.js、およびSocket.IOを使用しています。

4

1 に答える 1

10

Socket.IO 認証設定を使用して、Cookie を Express から Cookie パーサー ミドルウェアに渡します。Cookie が解析されると、クライアントのセッション ID を取得し、セッション ストアから関連付けられたセッションをフェッチできます。

// we need to use the same secret for Socket.IO and Express
var parseCookie = express.cookieParser(secret);
var store = /* your MemoryStore, RedisStore, etc */;

io.set('authorization', function(handshake, callback) {
  if (handshake.headers.cookie) {
    // pass a req, res, and next as if it were middleware
    parseCookie(handshake, null, function(err) {
      handshake.sessionID = handshake.signedCookies['connect.sid'];
      // or if you don't have signed cookies
      handshake.sessionID = handshake.cookies['connect.sid'];

      store.get(handshake.sessionID, function (err, session) {
        if (err || !session) {
          // if we cannot grab a session, turn down the connection
          callback('Session not found.', false);
        } else {
          // save the session data and accept the connection
          handshake.session = session;
          callback(null, true);
        }
      });
    });
  } else {
    return callback('No session.', false);
  }
  callback(null, true);
});

クライアントが接続を試みるたびに、承認機能が実行されます。ハンドシェイク ヘッダー クッキー ( handshake.headers.cookies) を受け取り、 に渡しますexpress.cookieParser()。次に、Cookie パーサーはセッション ID を見つけ、store関連するセッションを検索します。次に、関連付けられたセッションを に保存して、次のhandshake.sessionようにアクセスできるようにします。

app.get('/', function(req, res) {
  req.session.property = 'a value';
});

io.sockets.on('connection', function(socket) {
  var session = socket.handshake.session;
  session.property // a value
});
于 2013-09-29T20:15:34.597 に答える