2012-08-25 24 views
8

Quiero hacer un manejo de sesión sobre websockets a través de node.js y socket.io sin necesariamente usar cookies y evitar express.js, porque también debe haber clientes que no se ejecutan en un entorno de navegador. ¿Alguien ya hizo esto o adquirió alguna experiencia con una prueba de concepto?sesión de Socket.io sin express.js?

+0

Los ejemplos en http://socket.io/ no usan expreso, pero supongo que ya lo saben. ¿Qué información adicional necesitas? –

Respuesta

1

Esto debería ser útil, https://github.com/LearnBoost/socket.io/wiki/Authorizing

Se podría realizar un seguimiento de todas las variables de sesión y únicamente identificar a los usuarios que utilizan una combinación de los siguientes disponible en handshakeData

{ 
    headers: req.headers  // <Object> the headers of the request 
, time: (new Date) +''  // <String> date time of the connection 
, address: socket.address() // <Object> remoteAddress and remotePort object 
, xdomain: !!headers.origin // <Boolean> was it a cross domain request? 
, secure: socket.secure  // <Boolean> https connection 
, issued: +date    // <Number> EPOCH of when the handshake was created 
, url: request.url   // <String> the entrance path of the request 
, query: data.query   // <Object> the result of url.parse().query or a empty object 
} 

Este ejemplo puede ayudar también , solo haga que sus clientes que no sean navegadores suministren la información de otra manera:

SocketIO + MySQL Authentication

+0

Buen punto, si puedo agregar un sessionid en req.headers en el cliente y validar esto en la autorización. Por lo tanto, tengo que escribir un manejador de sesión independiente desacoplado de la req y res vars. Tal vez podría usar connect-session como base de código para ser compatible con los almacenes de sesiones y otras cosas. ¿Sabes cómo puedo agregar valores al encabezado en el lado del cliente? Una vez que mi conexión websocket está autorizada, ¿es tan segura como una única solicitud HTTP validando su sesión todo el tiempo? –

3

Antes de que se establezca la conexión socket.io, existe un mecanismo de handshake, de manera predeterminada, todas las solicitudes correctamente recibidas se dan la mano con éxito. Sin embargo, existe un método para obtener datos del socket durante el intercambio de palabras y devolver verdadero o falso, dependiendo de su elección, que acepte o deniegue la solicitud de conexión entrante. Aquí hay un ejemplo de socket.io docs:

Como handshakeData se almacena después de la autorización, puede agregar o quitar datos de este objeto.

var io = require('socket.io').listen(80); 

io.configure(function(){ 
    io.set('authorization', function (handshakeData, callback) { 
    // findDatabyip is an async example function 
    findDatabyIP(handshakeData.address.address, function (err, data) { 
     if (err) return callback(err); 

     if (data.authorized) { 
     handshakeData.foo = 'bar'; 
     for(var prop in data) handshakeData[prop] = data[prop]; 
     callback(null, true); 
     } else { 
     callback(null, false); 
     } 
    }) 
    }); 
}); 

El primer argumento de devolución de llamada función es error, puede proporcionar una cadena aquí, que se negará automáticamente el cliente si no se establece en null. El segundo argumento es booleano, ya sea que quiera aceptar la solicitud entrante o no.

Cuestiones relacionadas