Hay dos soluciones genéricas para este problema. Ambas soluciones se basan en el enfoque de no publicar información en el público que no debería ser pública. Esto implica que tiene que implementar algún tipo de mecanismo de autenticación en su aplicación, por ejemplo. un formulario de inicio de sesión que crea una nueva sesión (y nuevas claves de sesión temporal). No hace falta decir que también debes usar https
/ wss
en lugar de http
/ ws
.
El primer método es publicar solo eventos públicos y obtener datos de eventos privados a través de un canal separado (por ejemplo, una nueva solicitud HTTP). Esto es lo que hace Stack Exchange con las notificaciones en vivo de la bandeja de entrada: los sockets solo se usan para notificar a los suscriptores nuevos mensajes de la bandeja de entrada, mientras que el contenido real solo se obtiene a través de http (s) cuando el usuario hace clic en la burbuja de notificación.
El segundo método es autenticar la conexión Socket.IO antes de almacenar el lado del servidor de socket. En Socket.IO, puede pasar información adicional con el protocolo de enlace a través de la opción query
. En el servidor, lea este valor y solo permita a los usuarios crear el socket después de la autenticación exitosa ( ejemplo la respuesta aceptada es para socket.io 0.9, busque aquí para socket.io 1.x ). Esta clave debe ser tratada como una cookie de sesión. Cuando el usuario cierra la sesión, el socket asociado con esta clave debe ser destruido y el token invalidado. Lo ideal es que esta clave se use solo una vez (es decir, se invalide después del primer uso), pero no funciona bien en la práctica si la conexión no es confiable y debe volver a conectarse a Socket.IO.
Como alternativa al rechazo del socket (método 2), también puede aceptar el socket y usar los detalles de autenticación para controlar si un usuario puede suscribirse a un evento o unirse a una sala. El cliente solo recibirá un evento si lo envía al servidor, por lo tanto, si no lo envía (por ejemplo, porque el usuario no está en la sala donde se transmite el evento), entonces no hay fuga de información.