Правила Firebase - проверка с помощью uid или uid.child при чтении - PullRequest
0 голосов
/ 09 апреля 2020

В моем проекте я разрешил пользователю создать учетную запись по электронной почте или по номеру телефона. При первом входе пользователя в систему я получаю дополнительные данные, такие как электронная почта (при входе по номеру 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",
  }      
},

Вот моя структура базы данных:

enter image description here

И я пытаюсь получить данные, как описано выше, и получаю сообщение об ошибке: У клиента нет прав доступа к нужным данным "

let ref = this.database.ref('login')
return ref.orderByChild('email_principal').equalTo(newEmail).once('value')
.then((snapshot) => {
})

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 09 апреля 2020

Чтобы разрешить пользователю запрашивать /login, ему нужно разрешение на чтение /login. Ваше правило определяет разрешение на чтение /login/$uid. Поэтому, независимо от того, что разрешено этим правилом, чтение /login будет отклонено.

Я думаю, вы надеетесь безопасно запросить базу данных .

"login": {
  ".read": "query.orderByChild == 'email_principal' &&
            query.equalTo == auth.token.email" 
}

Это позволяет пользователю читать /login , если у него есть запрос, указанный в правилах.

...