2012-01-19 14 views
8

Sto provando a utilizzare la funzione di autorizzazione di Socket.IO per ottenere i dati di sessione. Il problema è che anche se disconnetto e distruggo la mia sessione, Socket.IO ha ancora le vecchie informazioni sulla sessione, che chiaramente non sono l'ideale. Qualche idea su cosa sto facendo male nel codice qui sotto?La funzione di autorizzazione Socket.io non sta aggiornando i dati di sessione

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); 
}); 

E qui è il codice di connessione:

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 Ho lo stesso problema. Anche se il cookie di sessione del client scade o viene eliminato, la connessione Socket.IO ha ancora accesso ai vecchi dati e ritiene che la sessione sia ancora attiva. – dbau

risposta

4

Da 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); 
    }); 

}); 

Edit: codice di autenticazione

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 
}); 

Una volta ogni 60 secondi, la sessione viene toccato (quindi aggiornare ndr). Quando l'utente si disconnette, la sessione viene distrutta.

+0

Utilizziamo entrambi il codice dello stesso articolo. Sto usando il codice di autorizzazione trovato più in alto nella pagina, ma il mio problema è che il mio 'sessionID' (usato in' hs.sessionID') non è corretto o la relazione tra la sessione socket e l'archivio sessioni di Express 'è semplicemente non funziona come previsto. –

+0

Incolla l'intero codice, forse hai un errore di battitura. – alessioalex

+0

Ho aggiornato con tutto il mio codice. –

0

Non sono sicuro che il 60 * 1000 significhi 60 minuti. Direi che è 1 mn.

+0

Sono i millisecondi. 1000 ms * 60 è 60 secondi. –

Problemi correlati