Поскольку вы прокомментировали ответ Мухаммеда о том, что пользователь еще не вошел в систему, ожидается, что ваши правила отклонят запрос. Очевидное решение - разрешить чтение всем:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{user} {
allow read;
allow write: if request.auth != null && user == request.auth.uid;
}
}
}
Обратите внимание, что это подвергает весь ваш список пользователей всему миру, что может быть угрозой безопасности.
Вы можете захотеть ограничить то, что пользователь может запросить, используя подход, описанный в безопасный запрос данных . Чтобы защитить запрос, вы должны указать операцию list
:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{user} {
allow list: /* TODO: something to require a query on email address */;
allow read, write: if request.auth != null && user == request.auth.uid;
}
}
}
Примечание: я все еще ищу, как проверить запрос в правилах, поскольку из документации кажется, что условие where()
не выставлено в request.query
.
Но это по-прежнему сопряжено с риском раскрытия данных другого пользователя: если вы знаете чей-либо адрес электронной почты, вы можете перечислить его документ и таким образом получить его данные.
Чтобы предотвратить это, у вас есть два варианта:
- Создание облачной функции (или другой конечной точки на стороне сервера), которая выполняет запрос в доверенной среде и возвращает пользователю только результат
true
/ false
.
- Создайте отдельную коллекцию, используя только адреса электронной почты пользователей. В этой коллекции я использую адреса электронной почты в качестве идентификатора документа, а затем сохраняю UID пользователя в качестве (вероятно, единственного) значения в документе.
То, что вы пытаетесь реализовать, звучит довольно близко к API Firebase Authentication fetchSignInMethodsForEmail
, в котором перечислены поставщики для данного адреса электронной почты. Идея этого API заключается в том, что вы комбинируете его с параметром «разрешить только одну учетную запись на адрес электронной почты», чтобы реализовать поток, в котором на первом экране пользователь вводит свой адрес электронной почты, а затем на втором экране вы либо разрешаете ему зарегистрироваться (адрес электронной почты еще не известен) или запросить их учетные данные.