Чтобы иметь возможность проверить, существует ли определенный узел, вы должны быть в состоянии прочитать этот узел.Если мы посмотрим конкретно на ваш код:
usersRef.child('users').child(userId).once('value', ...
Этот код требует, чтобы у пользователя был доступ на чтение к /users/$userId
. не требует, чтобы они имели доступ ко всем /users
.
То же самое, если вы создадите узел верхнего уровня emails
, в котором вы сохраните электронные письма, которые уже используются.Чтобы проверить, используется ли конкретное письмо, пользователю нужен только доступ к /emails/$email
, ему не нужно иметь доступ к /emails
.
Итак:
{
"rules": {
"users": {
"$uid": {
".read": "auth.uid !== null"
}
},
"emails": {
"$email": {
".read": "auth.uid !== null"
}
}
}
}
Большое значение в этих правилах заключается в том, что любой, кто попытается прочитать из /users
или /emails
, будет отклонен, что не позволит им получить доступ к списку всех пользователей или электронных писем.Но, учитывая индивидуальный UID или адрес электронной почты, они могут проверить, заявлено ли это уже или нет.
Обратите внимание, что создание собственного сервиса тоже подойдет.Но если основной вариант использования заключается в том, чтобы надежно проверить, заявлен ли уже определенный UID / электронная почта, вы, вероятно, можете обойтись только с базой данных.