2011-06-18 18 views
19

sé que puedo usar¿Cómo acceder a la sesión en express, fuera de la solicitud?

function(req, res) { 
    req.session 
} 

usando expreso. Sin embargo, necesito acceder a la sesión fuera de la función de respuesta. ¿Cómo voy a hacer eso?

Estoy usando socket.io para pasar información para agregar publicaciones y comentarios. Entonces, cuando recibo el mensaje socket.io en el lado del servidor, necesito verificar la persona que publica la información usando la sesión. Sin embargo, como esto se hace a través de socket.io, no hay req/res.

+0

Lo que terminé haciendo fue darle a cada usuario un nombre de usuario para iniciar sesión y cambiarlo con bastante frecuencia, y luego usarlo en los mensajes de socket para verificar que realmente eran quienes decían que eran. – MrBojangles

Respuesta

7

Usando socket.io, he hecho esto de una manera simple. Asumo que tiene un objeto para su aplicación digamos MrBojangle, por el mío se llama Shished:

/** 
* Shished singleton. 
* 
* @api public 
*/ 
function Shished() { 
}; 


Shished.prototype.getHandshakeValue = function(socket, key, handshake) {       
    if(!handshake) { 
     handshake = socket.manager.handshaken[ socket.id ];           
    } 
    return handshake.shished[ key ];                 
};                         

Shished.prototype.setHandshakeValue = function(socket, key, value, handshake) {     
    if(!handshake) { 
     handshake = socket.manager.handshaken[ socket.id ];           
    } 
    if(!handshake.shished) { 
     handshake.shished = {};                  
    } 
    handshake.shished[ key ] = value;                
}; 

Luego de su método de autorización, estoy usando MongoDB para el almacenamiento de sesión:

io.set('authorization', function(handshake, callback) { 
    self.setHandshakeValue(null, 'userId', null, handshake); 
    if (handshake.headers.cookie) { 
     var cookie = connect.utils.parseCookie(handshake.headers.cookie); 
     self.mongoStore() 
     .getStore() 
     .get(cookie['connect.sid'], function(err, session) { 
      if(!err && session && session.auth && session.auth.loggedIn) { 
       self.setHandshakeValue(null, 
          'userId', 
          session.auth.userId, 
          handshake); 
      } 
     }); 
    } 

Entonces, antes de guardar un registro en el modelo, que puede hacer:

model._author = shished.getHandshakeValue(socket, 'userId');

+0

Esto es en realidad casi exactamente lo que terminamos haciendo! – MrBojangles

+0

Me alegra que haya ayudado. – vimdude

+0

parseCookie ya no funcionará – UpTheCreek

0

Asumiendo que su código socket.io se ve un poco como esto:

io.on('connection', 
function(client) { 
    console.log(client.request) 
}); 

La solicitud es client.request como se muestra en el ejemplo anterior.

Editar: como una cosa separada, tal vez esto ayudaría: https://github.com/aviddiviner/Socket.IO-sessions

+0

Estaba muy emocionado cuando leí su respuesta, pero después de imprimir el contenido del "cliente".request "variable Encontré que por alguna razón están pasando casi todo lo que no sea la sesión. No estoy seguro de por qué la información de la sesión no está incluida, parece que debería ser. ¿Alguna otra idea? – MrBojangles

+1

@ user776796 debe ser capaz de acceder a la cookie 'client.request.headers.cookie', y usarla para verificar su tienda de sesión. – Harry

+0

Desafortunadamente no." headers.cookie "está ahí con mis cookies listadas, sin embargo mi información de sesión no está incluida en ella – MrBojangles

0

Creo comprobar socket.handshake debe conseguir que la sesión:

io.sockets.on('connection', function(socket) { 
    console.log(socket.handshake.sessionID); 
}); 

Cuando el cliente establece una conexión de socket con su zócalo servidor .io, el cliente envía una solicitud de protocolo de enlace WebSocket. Lo que estoy haciendo arriba es agarrar la identificación de la sesión desde el apretón de manos.

6

creo que tengo una respuesta diferente.

código:

var MongoStore = require('connect-mongo')(session); 
var mongoStore = new MongoStore({ 
    db:settings.db,   //these options values may different 
    port:settings.port, 
    host:settings.host 
}) 
app.use(session({ 
    store : mongoStore 
    //here may be more options,but store must be mongoStore above defined 
})); 

entonces debería definir una clave de sesión en REQ, al igual que:

código:

req.session.userEmail; 

último, se puede obtener de esta manera:

código:

var cookie = require("cookie"); //it may be defined at the top of the file 
io.on("connection",function(connection){ 

var tS = cookie.parse(connection.handshake.headers.cookie)['connect.sid']; 
var sessionID = tS.split(".")[0].split(":")[1]; 
mongoStore.get(sessionID,function(err,session){ 
     console.log(session.userEmail); 
}); 
} 

Lo probé ayer, funcionó bien.

+0

Gran solución. – jordajm

+0

¡Santo cielo, esto funciona! 3 años después y sigue siendo una respuesta sólida. Patear el culo. –

Cuestiones relacionadas