В моем проекте я разрешил пользователю создать учетную запись по электронной почте или по номеру телефона. При первом входе пользователя в систему я получаю дополнительные данные, такие как электронная почта (при входе по номеру phoneNumber) и phoneNumber (при входе по электронной почте), и обновляю данные пользователя через облачную функцию, чтобы обе данные обновлялись в объекте auth ().
Теперь я бы хотел, чтобы пользователь не создавал 2 учетных записи. Итак, для этого я сохраняю данные в своей базе данных, а затем проверяю, есть ли у нового пользователя по номеру phoneNumber (например) учетная запись с его информированной электронной почтой.
Это нормально, но у меня есть защита проблема, которую нужно решить: чтобы сделать это, мне нужно, чтобы пользователь мог читать все дочерние элементы по ключу «login», и я хотел бы разрешить чтение только по своему собственному uid и любому другому, у которого есть дочерний ключ с именем «email_principal», такой же как его информированное электронное письмо.
Вот мои новые правила базы данных, которые не работают:
"login": {
"$uid": {
".read": "auth.uid === $uid || auth.token.admin === true || auth.token.email === data.child('email_principal').val()",
".write": "auth.uid === $uid || auth.token.admin === true",
}
},
Я уже пытался сделать это (тоже не работает):
"login": {
"$uid": {
".read": "auth.uid === $uid || auth.token.admin === true || auth.token.email === root.child('email_principal/'+$uid+'/email_principal').child.val()",
".write": "auth.uid === $uid || auth.token.admin === true",
}
},
Вот моя структура базы данных:
И я пытаюсь получить данные, как описано выше, и получаю сообщение об ошибке: У клиента нет прав доступа к нужным данным "
let ref = this.database.ref('login')
return ref.orderByChild('email_principal').equalTo(newEmail).once('value')
.then((snapshot) => {
})
Каков наилучший способ сделать это?