Esto no es realmente demasiado duro, pero lo aborda de la manera equivocada.Un par de cosas:
No se puede establecer una cookie con socket.io; sin embargo, puede obtener los valores de las cookies de cualquier cliente conectado en cualquier momento. Para establecer una cookie, deberá enviar una nueva respuesta http, lo que significa que el usuario primero debe enviar una nueva solicitud HTTP (también conocida como actualizar o ir a una página nueva, lo que parece que no es una posibilidad para usted aquí).
Sí: socket.io es seguro (en la medida en que los datos transmitidos pueden ser).
Como tal, puede hacer lo siguiente:
En conexión inicial del usuario, crear una cookie con un ID de sesión único, como los generados a partir de middleware sesión de Express. Deberá configurarlos para que no caduquen al finalizar la sesión (de lo contrario caducará tan pronto como cierren su navegador).
A continuación, debe crear un objeto para almacenar los ID de la sesión de cookie. Cada vez que se establece una nueva cookie connect.sid, almacene en su nuevo objeto un valor predeterminado de falso (lo que significa que el usuario ha sido autenticado por sesión, pero no por el inicio de sesión)
En el inicio de sesión del usuario, envíe un socket emitir al servidor, donde puede autenticar las credenciales de inicio de sesión y, posteriormente, actualizar el objeto de id de sesión que creó para leer verdadero (conectado) para el ID de socket actual.
Ahora, al recibir una nueva solicitud http, lea cookie.sid y compruebe si su valor en el objeto es verdadero.
Debe tener un aspecto como el siguiente:
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
});
});
¿Hay una manera tal de establecer que la conexión autenticada dentro socket.io una vez establecida la conexión y apretón de manos completa? El usuario podría proporcionar detalles de inicio de sesión cuando esté listo para una conexión existente, el servidor podría validar y devolver una ID de sesión única. La javascript del lado del cliente podría guardar una cookie para uso futuro. –
Consulte [este artículo] (http://www.danielbaulig.de/socket-ioexpress/) sobre cómo autenticar las sesiones de socket.io. – fent
Sí, ya he leído ese artículo. Aunque estoy bastante feliz configurando una cookie, no permite iniciar sesión en la misma página si el socket ya está abierto. ¿También se sufre presumiblemente si el usuario tiene cookies deshabilitadas? –