Ошибка Nuxt Firebase Firebase: отсутствуют или недостаточны разрешения

#javascript #firebase #google-cloud-firestore #nuxt.js #firebase-security

#javascript #firebase #google-облако-firestore #nuxt.js #firebase-безопасность

Вопрос:

Я пытаюсь прочитать коллекцию документов, только если в документе указан идентификатор пользователя текущего пользователя, вошедшего в firebase. Вот мои правила базы данных:

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

Создание документов не проблема, но их чтение. Вот моя функция, которая извлекает данные:

 getData () {
  this.$fire.firestore.collection('todos').get()
    .then((doc) => {
      if (doc.exists) {
        console.log('Document data:', doc.data())
      } else {
        // doc.data() will be undefined in this case
        console.log('No such document!')
      }
    }).catch((error) => {
      console.log('Error getting document:', error)
    })
}
 

Кажется, что resource.data.id правило не указывает на идентификатор пользователя todo, и поэтому я получаю FirebaseError: отсутствуют или недостаточно разрешений. Вот моя текущая структура базы данных:

Структура данных Firebase

Есть идеи о том, почему правило работает не так, как задумано?

Ответ №1:

Правила безопасности Firebase не фильтруют данные. Вместо этого они просто гарантируют, что любая выполняемая вами операция соответствует установленным вами правилам.

Итак, это правило, которое у вас есть, гласит, что пользователь может читать только документы, которые имеют свой собственный UID:

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

Но затем ваш код продолжает работу и пытается прочитать все документы:

 this.$fire.firestore.collection('todos').get()
 

Поскольку ваши правила не позволяют читать все документы, операция отклоняется.

Чтобы разрешить операцию, убедитесь, что ваша операция чтения соответствует вашим правилам, и запрашивайте документы только там, где соответствует UID:

 let uid = ...
this.$fire.firestore.collection('todos').where("userId", "==", uid).get()
 

Ответ №2:

Я уже решил проблему, метод получения данных из firestore был неполным, решение было в документации firebase.

Правильный способ извлечения данных — использовать ограничение where:

 getData () {
      this.$fire.firestore.collection('todos').where('userId', '==', this.user.uid).get()
        .then((docs) => {
          if (docs) {
            // console.log('Document data:', docs.data())
            docs.forEach((doc) => {
              console.log(doc.data())
            })
          } else {
            // doc.data() will be undefined in this case
            console.log('No such document!')
          }
        }).catch((error) => {
          console.log('Error getting document:', error)
        })
    }
 

Комментарии:

1. Действительно, я просто баловался. Я снова отметил ваш ответ.