Reglas de autorización adecuadas para contenido protegido en firebase


¿Existe un enfoque de mejores prácticas para las reglas de autorización adecuadas para el contenido protegido en una aplicación firebase

  • usando firepad específicamente
  • Por contenido protegido me refiero a donde un usuario crea un documento y solo lo comparte con ciertos otros usuarios).
  • También necesito poder consultar firebase para todos los documentos a los que tengo acceso (documentos que creé y documentos que otros usuarios compartieron conmigo)

Algunas de mis investigaciones far:

Método 1: URL secreta

  • Necesito saber la URL para poder ver/editar el documento

  • No es una autorización real, ya que cualquier usuario registrado que tenga acceso a esa URL podría editarla / modificarla.

  • No puedo indexar todos los documentos a los que tengo acceso

Método 2: Usando reglas de autorización de firebase para agregar usuarios a un documento y verificar si el usuario es un documento.usuarios antes de leer / escribir.

Tomada De: ¿Es posible el contenido protegido en Firebase?

{

"documents": {

   "$documents_id": {

       // any friend can read my post

       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",

       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"

   },

   users:{

   // List of user.ids that have access to this document

   }

}

}

Ventajas:

  • Autorización/autenticación adecuada. Solo los usuarios autenticados a los que se les ha concedido acceso pueden ver/editar.

Contras:

  • No puede consultar todos los documentos que un usuario puede editar (aquellos que poseo o que he compartido conmigo) (¿Es esta suposición correcta?)

Método 3: Reglas de autorización de Firebase (método 2), más un almacén redundante de usuarios con array de document_ids a los que cada usuario tiene acceso. Este almacén de usuarios solo se usaría para consultar todos los documentos a los que un usuario tiene acceso. ie:

{
"documents": {
   "$documents_id": {
       // any friend can read my post
       ".read":  "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()",
       // any friend can edit my post
       ".write": "auth.id === data.child('owner').val() || root.child('users/'+data.child.owner.val()+'/users/'+auth.id).exists()"
   }
},
"users":{
    "$user":{
        ".read": "auth.id=$user.id",
        ".write": "auth.id=$user.id"
        "$documents":{
            // All the documents i have access to. This list gets ammended whenever I am granted/stripped access to a document.
        }
    }
}
}

Ventajas:

  • Autenticación / autorización adecuada

Contras:

  • Datos duplicados, tienen que lidiar con problemas de sincronización entre dos almacenes de datos. Esto no parece una buena idea.

Método 4: Grupos

Usando grupos por Otorgando acceso a ubicaciones de Bases de fuego para un grupo de usuarios

  • Tenemos un grupo para cada documento en data store

  • No puede consultar fácilmente firebase para todos los documentos a los que un usuario puede acceder

¿Hay una mejor manera de hacer esto?

Author: Community, 2013-07-23

1 answers

Has hecho un buen trabajo enumerando las opciones, y definitivamente estás en el camino correcto. Como has descubierto, no hay forma de realizar consultas basadas en reglas de seguridad. Esto se hizo intencionalmente, ya que (dependiendo de sus reglas de seguridad) esto podría ser bastante costoso (Firebase evita consultas complejas en general por esta razón).

Así que su método 3 es la forma correcta exacta de hacer esto. Duplicar datos para este tipo de situaciones es en realidad una práctica muy común. Ver Desnormalizar Sus Datos es Normal para una publicación de blog que entra en más detalles sobre esto.

También podría hacer el método 1 con la lista de documentos duplicados. Esto es especialmente útil si desea poder "invitar" a alguien a un documento solo con una URL (que contiene el ID secreto). O podrías hacer una combinación de los dos (tener algunos documentos "públicos pero no listados" y algunos "privados para amigos invitados" o lo que sea.)

 13
Author: Michael Lehenbauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 23:31:20