2013-09-29 4 views
7

У меня есть чат, и мне нужно управлять уникальными подключениями. Я искал вокруг, но решения, которые я нашел, кажутся устаревшими.Как получить доступ к идентификатору сеанса при использовании Socket.IO?

Итак, как я могу получить идентификатор сеанса сокета с Socket.IO?

Я использую Node.js, Express.js и Socket.IO.

ответ

10

Используйте параметр проверки подлинности Socket.IO и передайте файлы cookie в промежуточное программное обеспечение для анализатора cookie из Express. После анализа файла cookie вы можете получить идентификатор сеанса клиента и получить связанный сеанс из хранилища сеансов, будь то история памяти или другой тип хранилища.

// 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); 
}); 

Каждый раз, когда клиент пытается подключиться, запускается функция авторизации. Он берет файлы cookie заголовка рукопожатия (handshake.headers.cookies) и передает их express.cookieParser(). Затем анализатор cookie находит идентификатор сеанса, а затем ищет 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 
}); 
+0

Спасибо за помощь! Но Im получает «TypeError: Can not read property» connect.sid «undefined», вы теперь, что я делаю неправильно? – viniciuswebdev

+0

Имя файла cookie может отличаться. Вместо этого может быть 'express.sid', но вы должны проверить его с помощью браузера. – hexacyanide

+0

С console.log (handshake.signedCookies); он показывает «{}», а console.log (handshake.cookie) показывает «undefined». Я не знаю, забываю ли я что-то добавить. Благодаря! – viniciuswebdev

Смежные вопросы