Это не так уж сложно, но вы подходите к этому неправильно. Пара вещей:
Вы не можете установить куки с socket.io; однако вы можете в любое время получить значения cookie любого подключенного клиента. Чтобы установить cookie, вам нужно будет отправить новый http-ответ, а это означает, что пользователь должен сначала отправить новый http-запрос (или обновить или перейти на новую страницу, что, как вам кажется, здесь невозможно).
Да: socket.io безопасен (в той степени, в которой могут быть переданы любые данные).
Таким образом, вы можете сделать следующее:
В исходном соединении пользователя создайте файл cookie с уникальным идентификатором сеанса, например, сгенерированным из промежуточного программного обеспечения сеанса Express. Вам нужно будет настроить, чтобы они не истекали в конце сеанса (в противном случае он истечет, как только они закроют свой браузер).
Далее вы должны создать объект для хранения идентификаторов сеансов cookie. Каждый раз, когда устанавливается новый cookie-файл connect.sid, сохраняйте в новом объекте значение по умолчанию, равное false (это означает, что пользователь прошел аутентификацию по сеансу, но не по входу в систему)
При входе пользователя в систему отправьте emit сокета на сервер, где вы сможете затем аутентифицировать учетные данные для входа в систему, а затем обновить созданный вами объект идентификатора сеанса, чтобы получить значение true (вошедшее в систему) для текущего идентификатора сокета.
Теперь при получении нового http-запроса прочитайте cookie.sid и проверьте, является ли его значение в вашем объекте истинным.
Это должно выглядеть примерно так:
var express = require('express'),
http = require('http'),
cookie = require('cookie');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
app.use(express.cookieParser());
app.use(express.session({
secret: 'secret_pw',
store: sessionStore,
cookie: {
secure: true,
expires: new Date(Date.now() + 60 * 1000), //setting cookie to not expire on session end
maxAge: 60 * 1000,
key: 'connect.sid'
}
}));
var sessionobj = {}; //This is important; it will contain your connect.sid IDs.
//io.set('authorization'...etc. here to authorize socket connection and ensure legitimacy
app.get("/*", function(req, res, next){
if(sessionobj[req.cookies['connect.sid']]){
if(sessionobj[req.cookies['connect.sid']].login == true){
//Authenticated AND Logged in
}
else{
//authenticated but not logged in
}
}
else{
//not authenticated
}
});
io.sockets.on('connection', function(socket){
sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].login = false;
sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].socketid = socket.id;
socket.on('login', function(data){
//DB Call, where you authenticate login
//on callback (if login is successful):
sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid']] = true;
});
socket.on('disconnect', function(data){
//any cleanup actions you may want
});
});