session - example - Autorización de Sails.js para solicitudes de socket
sails socket (4)
envíe una solicitud JSONP desde su aplicación antes de enviar una solicitud de socket, que creará una cookie y aceptará solicitudes de socket.
Intento crear una aplicación de chat basada en sails.js. La URL de los mensajes de un chat específico se ve así:
/api/chat/:id/messages
Cuando solicito esta URL con XHR, proporciona una cookie de sesión y sails.js construye un objeto de sesión. Puedo verificar fácilmente los derechos de los usuarios para leer los mensajes del chat específico.
Sin embargo, necesito solicitar esta URL con socket.io para que el cliente pueda suscribirse a todos los cambios futuros de la colección de messages
.
Cuando solicito esta URL con socket.io, no se establece ninguna cookie de sesión y la sesión sails.js está vacía. Por lo tanto, no puedo verificar los derechos de usuario en el lado del servidor.
Entiendo que las solicitudes de socket no son solicitudes de HTTP. No proporcionan cookies por sí mismos.
¿Hay alguna solución simple?
Encontré una forma de obtener el objeto de sesión que se configuró mientras hands.ake socket.io. En tu controlador, deberías hacer algo como esto:
myControllerAction: function(req, res) {
var session = req.session;
if (req.isSocket) {
var handshake = req.socket.manager.handshaken[req.socket.id];
if (handshake) {
session = handshake.session;
}
}
//session now contains proper session object
}
Puede implementar esto en la política de sails.js y adjuntar esta política a algunos controladores. ¡Pero no escriba su sesión socket en req.session
! De lo contrario, obtendrá un error al intentar responder al cliente (la req.session
original todavía se usa de alguna manera). En cambio, guárdelo como req.socketSession
o algo así.
alevkon, en el método mencionado anteriormente, tienes que implementar el mismo en todos los controladores, porque no sabes a qué controlador se accede por primera vez ... pero al enviar solo una solicitud jsonp puedes crear una cookie entre el cliente y servidor, la misma cookie se usa hasta la próxima sesión.
Puede hacer su inicio de sesión inicial sobre socket.post () en lugar de XHR, las solicitudes de socket subsiguientes serán autorizadas.