2012-04-24 15 views
5

Tengo una aplicación Rails 3.2 que usa Redis ya que es una tienda de sesiones. Ahora estoy a punto de escribir una parte de la nueva funcionalidad en Node.js, y quiero poder compartir información de sesión entre las dos aplicaciones.¿Existe una manera simple de compartir datos de sesión almacenados en Redis entre Rails y la aplicación Node.js?

Lo que puedo hacer manualmente es leer la cookie _session_id, y luego leer desde una clave Redis llamada rack:session:session_id, pero esto parece una especie de solución de hack-ish.

¿Hay una mejor manera de compartir sesiones entre Node.js y Rails?

+0

Rails/ruby ​​a veces usa referencias para serializar objetos. Si es así, no sería capaz de recuperarlos fácilmente en el nodo ... – sailor

+0

@sailor si eso sucede, puedo guardar JSON :) –

Respuesta

1

Esto puede ser completamente inútil si no planeas usar esto, pero toda mi experiencia de sesión con el nodo es a través del uso de Connect. Se podría utilizar el middlewhere sesión de conexión y cambiar el ID de la llave:

http://www.senchalabs.org/connect/session.html#session

y utilizar este módulo para utilizar Redis como almacén de sesión:

https://github.com/visionmedia/connect-redis

Nunca me he configuración algo así como sin embargo, lo que describes es que puede haber alguna piratería necesaria.

2

he hecho esto, pero sí requiere hacer sus propias horquillas de cosas

En primer lugar usted necesita para hacer la clave de sesión del mismo nombre. Ese es el trabajo más fácil.

A continuación, creé una horquilla de la gema redis-store y la modifiqué donde estaba la clasificación. Necesito hablar con json en ambos lados porque encontrar un módulo de estilo Rubis para javascript no es fácil. The file where I alter marshalling

También tuve que reemplazar la porción de middleware de sesión de connect. El hash que se crea es muy específico y no coincide con el que crea el riel. Tendré que dejarte esto para que hagas ejercicio porque podría haber una manera más agradable. Podría haber bifurcado conectar pero en su lugar extraje una copia de conexión> middleware> sesión y requirió la mía.

Notarás cómo el original agrega una variable base que no está presente en la versión de rieles. Además, debe manejar el caso cuando los rieles han creado una sesión en lugar de un nodo, eso es lo que hace la función generateCookie.

/***** ORIGINAL *****/ 
// session hashing function 
store.hash = function(req, base) { 
    return crypto 
    .createHmac('sha256', secret) 
    .update(base + fingerprint(req)) 
    .digest('base64') 
    .replace(/=*$/, ''); 
}; 

// generates the new session 
store.generate = function(req){ 
    var base = utils.uid(24); 
    var sessionID = base + '.' + store.hash(req, base); 
    req.sessionID = sessionID; 
    req.session = new Session(req); 
    req.session.cookie = new Cookie(cookie); 
}; 

/***** MODIFIED *****/ 
// session hashing function 
store.hash = function(req, base) { 
    return crypto 
    .createHmac('sha1', secret) 
    .update(base) 
    .digest('base64') 
    .replace(/=*$/, ''); 
}; 

// generates the new session 
store.generate = function(req){ 
    var base = utils.uid(24); 
    var sessionID = store.hash(req, base); 
    req.sessionID = sessionID; 
    req.session = new Session(req); 
    req.session.cookie = new Cookie(cookie); 
}; 

// generate a new cookie for a pre-existing session from rails without session.cookie 
// it must not be a Cookie object (it breaks the merging of cookies) 
store.generateCookie = function(sess){ 
    newBlankCookie = new Cookie(cookie); 
    sess.cookie = newBlankCookie.toJSON(); 
}; 

//... at the end of the session.js file 
    // populate req.session 
    } else { 
    if ('undefined' == typeof sess.cookie) store.generateCookie(sess); 
    store.createSession(req, sess); 
    next(); 
    } 

Espero que esto funcione para usted. Me costó bastante buscarlos para hacerles hablar de la misma manera.

Encontré un problema también con los mensajes flash que se almacenan en json. Espero que no encuentres ese. Los mensajes flash tienen una estructura de objeto especial que se va volando cuando se serializa. Cuando se restaura el mensaje flash de la sesión, es posible que no tenga un objeto flash adecuado. Necesitaba parchar para esto también.

Cuestiones relacionadas