La mejor manera de administrar canales de chat en Firebase

Resuelto Eusthace asked hace 54 años • 4 respuestas

En mi página principal tengo una lista de usuarios y me gustaría elegir y abrir un canal para chatear con uno de ellos.

Estoy pensando si usar la identificación es la mejor manera y controlar el acceso de un canal como USERID1-USERID2.

Pero, por supuesto, el usuario 2 también puede abrir el mismo canal, así que me gustaría encontrar algo más fácil de controlar.

Por favor, si quieres ayudarme, dame un ejemplo en javascript usando una URL/matriz de Firebase.

¡Gracias!

Eusthace avatar Jan 01 '70 08:01 Eusthace
Aceptado

Una forma común de manejar este tipo de salas de chat 1:1 es generar la URL de la sala en función de los ID de los usuarios. Como ya mencionaste, un problema con esto es que cualquiera de los usuarios puede iniciar el chat y en ambos casos deberían terminar en la misma sala.

Puede resolver esto ordenando lexicográficamente los identificadores de usuario en la clave compuesta. Por ejemplo, con nombres de usuario, en lugar de identificadores:

var user1 = "Frank"; // UID of user 1
var user2 = "Eusthace"; // UID of user 2

var roomName = 'chat_'+(user1<user2 ? user1+'_'+user2 : user2+'_'+user1);

console.log(user1+', '+user2+' => '+ roomName);
            
user1 = "Eusthace";
user2 = "Frank";

var roomName = 'chat_'+(user1<user2 ? user1+'_'+user2 : user2+'_'+user1);

console.log(user1+', '+user2+' => '+ roomName);
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
Expandir fragmento

Una pregunta de seguimiento común parece ser cómo mostrar una lista de salas de chat para el usuario actual. El código anterior no aborda eso. Como es común en las bases de datos NoSQL, debe aumentar su modelo de datos para permitir este caso de uso. Si desea mostrar una lista de salas de chat para el usuario actual, debe modelar sus datos para permitirlo. La forma más sencilla de hacerlo es agregar una lista de salas de chat para cada usuario al modelo de datos:

"userChatrooms" : {
  "Frank" : {
    "Eusthace_Frank": true
  },
  "Eusthace" : {
    "Eusthace_Frank": true
  }
}

Si le preocupa la longitud de las claves, puede considerar el uso de códigos hash de los UID combinados en lugar de los UID completos.


Esta última estructura JSON anterior también ayuda a proteger el acceso a la sala, ya que puede escribir sus reglas de seguridad para permitir el acceso solo a los usuarios para quienes la sala figura en su userChatroomsnodo:

{
  "rules": {
    "chatrooms": {
      "$chatroomid": {
        ".read": "
           root.child('userChatrooms').child(auth.uid).child(chatroomid).exists()
        "
      }
    }
  }
}
Frank van Puffelen avatar Nov 05 '2015 14:11 Frank van Puffelen

En un esquema de base de datos típico, cada canal/grupo de chat tiene su propio nodo con una clave $ única (creada por Firebase). No debería importar qué usuario abrió el canal primero, pero una vez que se crea el nodo (y la clave $ correspondiente), puede usarlo como identificación del canal.

La estrategia Hashing/MD5, por supuesto, es otra forma de hacerlo, pero también debe almacenar esa información de "ruta" así como la clave $ en el mismo nodo, lo cual es una duplicación en mi opinión (a menos que me falte algo).

Neo Split avatar Apr 16 '2017 22:04 Neo Split