Используйте параметр проверки подлинности 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
});
Спасибо за помощь! Но Im получает «TypeError: Can not read property» connect.sid «undefined», вы теперь, что я делаю неправильно? – viniciuswebdev
Имя файла cookie может отличаться. Вместо этого может быть 'express.sid', но вы должны проверить его с помощью браузера. – hexacyanide
С console.log (handshake.signedCookies); он показывает «{}», а console.log (handshake.cookie) показывает «undefined». Я не знаю, забываю ли я что-то добавить. Благодаря! – viniciuswebdev