Evitando que el socket.join ("sala") del lado del cliente, escuche si hay sala privada

1

Estoy desarrollando una aplicación con Socket.IO que debe autentificarse si el usuario puede unirse a una sala.

lado del cliente:

var socket = io('http://<?php echo $_SERVER['HTTP_HOST'];?>:3000');
socket.on('connect', function() {
    var req = [current_user_id,secret_hash];
    socket.emit('join', req);
});

El servidor escucha las solicitudes de combinación de clientes, obtiene acceso a una base de datos MySQL y evalúa si el usuario puede unirse o no al canal hash solicitado:

        ...
        if (rows.length == 1) {
            socket.join(request[1]); //join on channel ID which is request[1] cell of array
        }
        //if not authorized, does not allow joining.
        ...

Tengo dos preguntas:

1) No quiero permitir la activación directa del canal por parte del cliente. Los clientes no deben poder iniciar socket.join ("sala"). ¿Cómo puedo bloquear esas solicitudes? El servidor es el único que se preocupa por la asignación de habitaciones.

2) ¿Hay alguna forma de escuchar el evento "el usuario deja su ID de canal privado"?

Gracias.

    
pregunta Mario Villani 03.01.2015 - 02:12
fuente

1 respuesta

7

La biblioteca socket.io del lado del cliente no tiene la capacidad de .join() a room. Esa capacidad solo se encuentra en la biblioteca del lado del servidor (porque ahí es donde se mantienen las salas) y, por lo tanto, es el único lugar donde se puede procesar.

Por lo tanto, la única forma de unirse a una sala es hacer su propio mensaje para una solicitud de combinación del cliente al servidor y procesar ese mensaje en el servidor en nombre de un cliente determinado, lo que le permite realizar cualquier tipo de verificación que desee Antes de que cualquier cliente pueda unirse a una habitación en particular. Como tal, debería estar seguro de la manera en que ya lo está haciendo.

Del mismo modo, solo hay dos formas en que un cliente abandona una habitación. La primera es cuando procesa su propio mensaje y llama a .leave() del lado del servidor, por lo que ciertamente puede monitorear en cualquier momento que suceda, ya que es su propio código del lado del servidor que llama a .leave() . La otra forma en que un cliente abandona una habitación es cuando el cliente se desconecta y usted también puede monitorear las desconexiones en el servidor. Al igual que con .join() , el cliente no puede llamar a .leave() directamente, por lo que no tiene que preocuparse por eso.

    
respondido por el jfriend00 03.01.2015 - 04:57
fuente

Lea otras preguntas en las etiquetas