Estoy usando un marco expreso. Quiero acceder a los datos de la sesión desde socket.io. Intenté expresar dynamicHelpers con datos de client.listener.server.dynamicViewHelpers, pero no puedo obtener datos de sesión. ¿Existe una forma sencilla de hacer esto? Por favor vea el código
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
Respuestas:
Esto no funcionará para los sockets que pasan por el transporte flashsocket (no envía al servidor las cookies necesarias) pero funciona de manera confiable para todo lo demás. Acabo de desactivar el transporte flashsocket en mi código.
Para que funcione, en el lado express / connect, defino explícitamente el almacén de sesiones para poder usarlo dentro del socket:
Luego, dentro de mi código de socket, incluyo el marco de conexión para poder usar su análisis de cookies para recuperar el connect.sid de las cookies. Luego busco la sesión en la tienda de sesiones que tiene ese connect.sid así:
A continuación, puede utilizar la sesión según sea necesario.
fuente
La solución del módulo de sesiones Socket.IO expone la aplicación a ataques XSS al exponer el ID de sesión a nivel del cliente (scripting).
En su lugar, verifique esta solución (para Socket.IO> = v0.7). Consulte los documentos aquí .
fuente
socket.io
es lo que expone el ID de sesión, no ese módulo. Esto no es un gran problema ya que la identificación de la sesión se almacena del lado del cliente en una cookie de todos modos ... Además, ese tutorial no funciona para la última versión de Express.socket.io
página de github ..?Sugiero no reinventar completamente la rueda. Las herramientas que necesitas ya son un paquete npm. Creo que esto es lo que necesitas: session.socket.io ¡ Lo estoy usando en estos días y será muy útil, supongo! ¡Vincular la sesión rápida a la capa socket.io tendrá tantas ventajas!
fuente
Editar: Después de probar algunos módulos que no funcionaron, en realidad fui y escribí mi propia biblioteca para hacer esto. Enchufe desvergonzado: échale un vistazo a https://github.com/aviddiviner/Socket.IO-sessions . Dejaré mi publicación anterior a continuación con fines históricos:
Obtuve este trabajo bastante bien sin tener que omitir el transporte de flashsocket según pr0zac la solución de anterior. También estoy usando express con Socket.IO. Así es cómo.
Primero, pase el ID de sesión a la vista:
Luego, en su opinión, vincúlelo con el lado del cliente de Socket.IO:
Luego, en el oyente Socket.IO del lado del servidor, recójalo y lea / escriba los datos de la sesión:
En mi caso, mi
session_store
es Redis, usando laredis-connect
biblioteca.Espero que esto ayude a alguien que encuentre esta publicación mientras busca en Google (como hice yo;)
fuente
Vea esto: Autenticación Socket.IO
¡Sugeriría no obtener nada a través de
client.request...
oclient.listener...
ya que no está directamente adjunto alclient
objeto y siempre apunte al último usuario que inició sesión!fuente
Echa un vistazo a Socket.IO-connect
Conecte el contenedor WebSocket Middleware alrededor del nodo Socket.IO https://github.com/bnoguchi/Socket.IO-connect
Esto le permitirá enviar las solicitudes de Socket.IO por la pila de middleware Express / Connect antes de manejarlas con los controladores de eventos de Socket.IO, lo que le brinda acceso a la sesión, las cookies y más. Aunque, no estoy seguro de que funcione con todos los transportes de Socket.IO.
fuente
Puede hacer uso de express-socket.io-session .
Comparta un middleware de sesión rápida basado en cookies con socket.io. Funciona con express> 4.0.0 y socket.io> 1.0.0 y no será compatible con versiones anteriores.
¡¡Trabajó para mi!!
fuente
Puedes echarle un vistazo a esto: https://github.com/bmeck/session-web-sockets
o alternativamente puede usar:
Espero que esto ayude.
fuente
No estoy seguro de estar haciéndolo bien. https://github.com/LearnBoost/socket.io/wiki/Authorizing
Con los datos del protocolo de enlace, puede acceder a las cookies. Y en las cookies, puede tomar connect.sid, que es la identificación de sesión para cada cliente. Y luego use connect.sid para obtener los datos de la sesión de la base de datos (supongo que está usando RedisStore)
fuente