2012-01-19 8 views
8

Estoy tratando de usar la función de autorización de Socket.IO para obtener datos de la sesión. El problema es que incluso si cierro la sesión y destruyo mi sesión, Socket.IO todavía tiene la información de la sesión anterior, lo que claramente no es ideal. ¿Alguna idea de lo que estoy haciendo mal en el siguiente código?La función de autorización de Socket.io no está actualizando los datos de la sesión

io.set('authorization', function (data, accept) { 
    if(data.headers.cookie) { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     app.set('mongo-store').get(data.sessionID, function (err, session) { 
      console.log(err, session); 
     if (err || !session) { 
       // if we cannot grab a session, turn down the connection 
       accept('Error', false); 
     } else { 
     // save the session data and accept the connection 
     data.session = session; 
     accept(null, true); 
     } 
     }); 
    } else { 
     return accept('No cookie transmitted.', false); 
    } 
    accept(null, true); 
}); 

Y aquí es el código de conexión:

io.sockets.on('connection', function(socket) { 

    var hs = socket.handshake; 
    console.log('A socket with sessionID ' + hs.sessionID 
     + ' connected!'); 
    // setup an inteval that will keep our session fresh 
    var intervalID = setInterval(function() { 
     // reload the session (just in case something changed, 
     // we don't want to override anything, but the age) 
     // reloading will also ensure we keep an up2date copy 
     // of the session with our connection. 
     hs.session.reload(function() { 
      // "touch" it (resetting maxAge and lastAccess) 
      // and save it back again. 
      hs.session.touch().save(); 
     }); 
    }, 60 * 1000); 
    socket.on('disconnect', function() { 
     console.log('A socket with sessionID ' + hs.sessionID 
      + ' disconnected!'); 
     // clear the socket interval to stop refreshing the session 
     clearInterval(intervalID); 
    }); 
}); 
+0

+1 Estoy teniendo el mismo problema. Incluso si la cookie de sesión del cliente caduca o se elimina, la conexión Socket.IO aún tiene acceso a los datos anteriores y cree que la sesión todavía está activa. – dbau

Respuesta

4

De http://www.danielbaulig.de/socket-ioexpress/

sio.sockets.on('connection', function (socket) { 
    var hs = socket.handshake; 
    console.log('A socket with sessionID ' + hs.sessionID 
     + ' connected!'); 
    // setup an inteval that will keep our session fresh 
    var intervalID = setInterval(function() { 
     // reload the session (just in case something changed, 
     // we don't want to override anything, but the age) 
     // reloading will also ensure we keep an up2date copy 
     // of the session with our connection. 
     hs.session.reload(function() { 
      // "touch" it (resetting maxAge and lastAccess) 
      // and save it back again. 
      hs.session.touch().save(); 
     }); 
    }, 60 * 1000); 
    socket.on('disconnect', function() { 
     console.log('A socket with sessionID ' + hs.sessionID 
      + ' disconnected!'); 
     // clear the socket interval to stop refreshing the session 
     clearInterval(intervalID); 
    }); 

}); 

Editar: Código de autenticación

io.set('authorization', function (handshakeData, callback) { 
    var cookie; 
    // console.log(handshakeData.headers); 
    if (handshakeData.headers && handshakeData.headers.cookie) { 
    cookie = parseCookie(handshakeData.headers.cookie); 
    // where SessionStore is an instance of your mongo store 
    SessionStore.load(cookie['sioapp.sid'], function (err, session) { 
     if (err) { 
     // if we cannot grab a session, turn down the connection 
     console.log(err); 
     } else { 
     // console.log('Successfully decoded the session: ', session); 
     handshakeData.session = session; 
     } 
    }); 
    } 
    callback(null, true); // error first callback style 
}); 

vez cada 60 segundos, la sesión se toca (así refrescar ed). Cuando el usuario se desconecta, la sesión se destruye.

+0

Ambos estamos usando el código del mismo artículo. Estoy usando el código de autorización encontrado más arriba en la página, pero mi problema es que mi 'sessionID' (como se usa en' hs.sessionID') no es correcto o la relación entre la sesión de socket y la tienda de sesión Express 'es simplemente no funciona como se esperaba –

+0

Pegue todo el código, tal vez tenga un error tipográfico. – alessioalex

+0

Actualicé con todo mi código. –

0

No estoy seguro de que el 60 * 1000 signifique 60 mn. Yo diría que es 1 mn.

+0

Son milisegundos. 1000 ms * 60 es 60 segundos. –

Cuestiones relacionadas