Ответ 1
Это не слишком сложно, но вы приближаетесь к нему неправильно. Пара вещей:
-
Вы не можете установить cookie с socket.io; однако вы можете получить значения cookie любого подключенного клиента в любое время. Чтобы установить cookie, вам нужно будет отправить новый ответ HTTP, то есть пользователь должен сначала отправить новый HTTP-запрос (например, обновить или перейти на новую страницу, что звучит для вас здесь не так).
-
Да: socket.io является защищенным (в той мере, в которой могут быть переданы любые данные).
Таким образом, вы можете сделать следующее:
В исходном подключении пользователя создайте файл cookie с уникальным идентификатором сеанса, например, сгенерированным из промежуточного программного обеспечения сеанса Express. Вам нужно будет настроить их, чтобы они не заканчивались на конце сеанса (в противном случае он истечет, как только они закроют браузер).
Затем вы должны создать объект для хранения идентификаторов сеанса cookie. Каждый раз, когда установлен новый файл cookie connect.sid, сохраняйте в своем новом объекте значение по умолчанию false (это означает, что пользователь был аутентифицирован сеансом, но не с помощью входа в систему)
При входе в систему пользователя отправьте сокет на сервер, где вы сможете аутентифицировать учетные данные для входа, а затем обновить объект идентификатора сеанса, который вы создали, для чтения истины (для входа в систему) для текущего идентификатора сокета.
Теперь, когда вы получаете новый 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
});
});