Android | Правила Firestore | Проверьте, существует ли уже имя пользователя и телефон

# #android #firebase #google-cloud-firestore #firebase-security

Вопрос:

Я хочу проверить, являются ли имя пользователя и номер телефона уникальными. Я реализовал его с помощью FirebaseFirestore.getInstance().collection("Users").whereEqualTo("phone",ph).get().addOnCompleteListener(...);

Это мое правило firestore:

 service cloud.firestore {
  match /databases/{database}/documents {
        match /{document=**} {
        allow read: true;
        allow write: if request.auth.uid != null;
        }
      match /Users/{userID} {
            allow update: if request.auth.uid == userID 
                amp;amp; (request.resource.data.username == resource.data.username
               || isUserNameAvailable(request.resource.data.username)
            );
        }
  }
 

Код отлично работает без каких-либо проблем. Я проверяю это перед signInWithCredential методом, и, следовательно, request.auth.uid всегда будет равен нулю. Чтобы заставить код работать, я должен сохранить allow read: true;
Но теперь я получаю это предупреждение

Мы обнаружили следующие проблемы с вашими правилами безопасности: любой пользователь может прочитать всю вашу базу данных

Есть ли какой-либо обходной путь, чтобы предотвратить это?

Ответ №1:

Это распространенная ошибка разработчиков при использовании usernames . Вы дали кому-либо разрешение на чтение всей вашей базы данных. И даже если вам удастся сделать это только для чтения Users , любой может прочитать все данные ваших пользователей.

Я бы рекомендовал удалить первый allow read:true и написать правила для каждого пути так, как они должны быть. Также создайте отдельный collection раздел только для имен пользователей и сохраните их все там, как /usernames/${username} и /phones/${phone} . Если вам нужно спастись вместе, вы можете это сделать.

Таким образом, вы можете очень легко проверить без каких-либо запросов, существует ли a username или phone , просто проверив, существует ли этот путь в вашей базе данных.

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