es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Nuxt + Firebase FirebaseError: Permisos insuficientes o faltantes.

Estoy intentando leer una colección de documentos solo si el documento tiene el ID de usuario del usuario actual que inició sesión con Firebase. Aquí están mis reglas de base de datos:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {  
    match /todos/{todoId} {
      allow read: if isLoggedIn() && request.auth.uid == resource.data.userId;
      allow create: if isLoggedIn() && request.auth.uid == request.resource.data.userId;
      allow update, delete: if isLoggedIn() && request.auth.uid == resource.data.userId;
    }

    function isLoggedIn() {
        return request.auth != null;
    }
  }
}

Crear documentos no es un problema, pero leerlos sí lo es. Aquí está mi función que recupera los datos:

getData () {
  this.$fire.firestore.collection('todos').get()
    .then((doc) => {
      if (doc.exists) {
        console.log('Datos del documento:', doc.data())
      } else {
        // doc.data() será undefined en este caso
        console.log('¡No existe tal documento!')
      }
    }).catch((error) => {
      console.log('Error al obtener el documento:', error)
    })
}

Parece que la regla resource.data.id no está apuntando al ID de usuario del todo y por lo tanto obtengo el error “FirebaseError: permisos insuficientes o faltantes”. Aquí está la estructura actual de mi base de datos:

Estructura de datos de Firebase

¿Alguna idea de por qué la regla no está funcionando como se pretende?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Según las reglas proporcionadas, parece que el problema radica en la condición resource.data.userId. Esta condición verifica si el campo userId del documento todo es igual al ID del usuario autenticado. Sin embargo, según la estructura de la base de datos proporcionada, parece que el campo userId en realidad está anidado dentro de un objeto user dentro del documento todo.

    Para solucionar la regla, debes actualizar la condición para acceder correctamente al campo userId. Suponiendo que el objeto user contiene solo un campo userId, la regla actualizada se vería así:

    allow read: if isLoggedIn() && request.auth.uid == resource.data.user.userId;
    

    Ten en cuenta que la sintaxis resource.data.user se utiliza para acceder al objeto user anidado, y luego se accede a userId dentro de ese objeto.

    Una vez realizado este cambio, la regla solo permitirá a los usuarios leer los documentos donde el campo userId dentro del objeto user sea igual al ID del usuario autenticado.

Comments are closed.