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:
¿Alguna idea de por qué la regla no está funcionando como se pretende?
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 campouserId
del documentotodo
es igual al ID del usuario autenticado. Sin embargo, según la estructura de la base de datos proporcionada, parece que el campouserId
en realidad está anidado dentro de un objetouser
dentro del documentotodo
.Para solucionar la regla, debes actualizar la condición para acceder correctamente al campo
userId
. Suponiendo que el objetouser
contiene solo un campouserId
, la regla actualizada se vería así:Ten en cuenta que la sintaxis
resource.data.user
se utiliza para acceder al objetouser
anidado, y luego se accede auserId
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 objetouser
sea igual al ID del usuario autenticado.