Estoy intentando configurar la autenticación basada en roles en Cloud Firestore. La intención es configurarlo para que solo los usuarios dentro de una organización puedan leer la organización o los eventos asociados. Funciona cuando el cliente solicita un solo documento (get), pero no una consulta de documentos (lista).
Mi colección llamada organizations se ve así, hasta ahora solo contiene un solo documento con ID devtest :
{ "name": "Dev Test" "users": [ "STFg0EvGemTaD2r9jyby0UMSt6O2" ] "orgid": "devtest" } También tengo una colección de events (hasta ahora solo contiene uno):
{ "name": "foo", "orgid": "devtest", ... }Y mis reglas se ven así:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { function isSignedIn() { return request.auth != null; } function userIsUser() { return isSignedIn() && request.auth.uid in get(/databases/$(database)/documents/organizations/$(resource.data.orgid)).data.users; } match /organizations/{org} { allow read: if userIsUser(); allow write: if false; } match /events/{event} { allow read: if userIsUser(); allow write: if userIsUser(); } } }Lo que me confunde es por qué puedo obtener y tiene éxito, por ejemplo:
firebase.firestore().collection('organizations').doc('devtest').get()pero cuando intento una consulta falla, por ejemplo:
firebase.firestore().collection('organizations').where('users', 'array-contains', firebase.auth().currentUser ? firebase.auth().currentUser.uid : false)responde con permiso denegado. Sé que una regla de seguridad no es un filtro, solo hay un documento en la colección en este momento.
¿Alguna sugerencia sobre lo que me podría estar perdiendo?
¡Gracias!
De acuerdo con esta documentación , el uso de objetos de autenticación causa problemas directamente, ya que pueden estar en un estado intermedio. Se recomienda que también cree un agente de escucha de autenticación que espere a que cambie el estado.
Al usar un observador, se asegura de que el objeto Auth no esté en un estado intermedio, como la inicialización, cuando obtiene el usuario actual. Cuando usa signInWithRedirect, el observador onAuthStateChanged espera hasta que getRedirectResult se resuelva antes de activarse.
Si esto sucede en su consulta, podría explicar por qué le da el error de permisos, ya que el objeto aún puede estar inicializándose y resolviéndose como falso en lugar de verdadero.