Firestore: PERMISSION_DENIED: Отсутствующие или недостаточные разрешения

Я получаю сообщение об ошибке

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Отсутствующие или недостаточные разрешения.

для приведенного ниже кода в инструкции else

db.collection("users")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                 if (task.isSuccessful()) {
                     for (DocumentSnapshot document : task.getResult()) {
                         s(document.getId() + " => " + document.getData());
                     }
                 } else {
                     s("Error getting documents."+ task.getException());
                 }
             }
         });

Ответ 1

Примечание: это полностью отключает безопасность базы данных, делая ее доступной для записи без аутентификации !!! Это НЕ решение рекомендовать.

Это просто работает для меня.

Зайдите в базу данных → Правила ->

Изменить allow read, write: if false; к истине;

Ответ 2

Перейти в базу данныхПравила:

Затем изменились ниже правила

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

ниже

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Ответ 3

убедитесь, что ваша БД не пуста или ваш запрос предназначен для коллекции, которой не существует

Ответ 4

Так что в моем случае у меня были следующие правила БД:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{story} {
      function isSignedIn() {
        return request.auth.uid != null;
      }

      allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}

Как видите, в документе story есть поле uid для пометки владельца.

Затем в своем коде я опрашивал все истории (Флаттер):

Firestore.instance
          .collection('stories')
          .snapshots()

И это не удалось, потому что я уже добавил несколько историй от разных пользователей. Чтобы это исправить, нужно добавить условие к запросу:

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()

Подробнее здесь: https://firebase.google.com/docs/firestore/security/rules-query

Ответ 5

Кроме того, вы можете получить эту ошибку, если ссылка на коллекцию из вашего кода не совпадает с именем коллекции в firebase.

Например, имя коллекции в firebase - users, но вы ссылаетесь на нее с помощью db.collection("Users") или db.collection("user")

Это также чувствительно к регистру.

Надеюсь, это поможет кому-то

Ответ 6

Если вы попробуете в Java Swing Application.

  1. Перейдите в консоль Firebase> Обзор проекта> Настройки проекта

  2. Затем перейдите на вкладку "Учетные записи служб" и нажмите "Создать новый закрытый ключ".

  3. Вы получите файл .json, поместите его по известному пути
  4. Затем перейдите в "Свойства моего компьютера", "Дополнительные параметры системы", "Переменные среды".
  5. Создайте новую переменную пути "GOOGLE_APPLICATION_CREDENTIALS" со своим путем к файлу json.

Ответ 7

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

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}

Ответ 8

  ВНИМАНИЕ: Это дает всем (даже не прошедшим проверку подлинности пользователям) доступ на чтение и запись ко всем вашим базам данных. Наверное, не то, что вы хотите!

Зайдите в базу данных → Правила -> и сделать это

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}