проверить, есть ли у пользователя, который только что зарегистрировался, электронная почта в списке действительных электронных писем. Если нет, это удаляет их.

я есть клиент, который хотел бы составить список запрещенных электронных писем, которые могут получить доступ к данным. Так что кто-то еще, приходящий в приложение, вообще не может читать / записывать какие-либо данные (в идеале даже не может войти, но я не думаю, что это возможно с Firebase?). Есть идеи, как это сделать? Я думал о том, чтобы получить массив принятых писем и проверить, существует ли их электронная почта в правилах безопасности, но, похоже, это не сработало. У меня было следующее в базе данных:

"validEmails": ["[email protected]"]

а затем в правилах безопасности:

".read": "root.child('validEmails').val().indexOf(auth.token.email) > -1"

Но похоже, что вы не можете использоватьindexOf в этих правилах безопасности.

Может быть, мне нужно иметь список приемлемых электронных писем, а затем, когда пользователь регистрируется, он проверяет, находятся ли они в этом списке, и добавляет их UID в принятый список? Я думаю, я мог бы сделать это через функцию облака или что-то?

Любая помощь приветствуется.

ура

 Frank van Puffelen04 сент. 2017 г., 15:38
«но это, похоже, не сработало» Похоже, вы попробовали что-то, что должно было сработать. Пожалуйста, измените ваш вопрос, чтобы включитьминимальный код, который воспроизводит то, что вы пытались, Также см. Этот ответ для более общего "заблокировать базу данных по домену"stackoverflow.com/questions/36943350/...
 Matt Sanders05 сент. 2017 г., 05:25
Извините, Фрэнк, я обновил вопрос, чтобы отразить код, который я пробовал, который не работал.

Ответы на вопрос(3)

я думаю, вы не сможете ограничить его адресами электронной почты или доменами. Однако вы можете защитить свою базу данных другим способом. Если ваши пользователи уже зарегистрированы и вы знаете ихuid, то вы можете ограничить доступ для чтения и записи на основе этих.

Представим, что у вас естьacl Объект в базе данных, вы можете перечислить пользователей и ихuid с их разрешениями на чтение / запись.

Эти правила будут проверять каждый запрос и разрешать доступ к данным только авторизованным пользователям.

{
  "acl": {
    [
      {
        "uid: "abc123"
        "canRead": true,
        "canWrite": true
      },
      {
        "uid": "def456",
        "canRead": true,
        "canWrite": false
      }
  },
  "secure": {
    ".read": { root.child('acl').child(auth.uid).child('canRead').val() == true }
    ".write": { root.child('acl').child(auth.uid).child('canWrite').val() == true }
  }
}
 Matt Sanders05 сент. 2017 г., 05:13
Спасибо, я задавался вопросом, было ли это так. Мне придется заново продумать подход клиентов к ситуации и выстроить ее вокруг этого.
Решение Вопроса

Спасибо, ребята, у меня получился список приемлемых писем:

{
    "validEmails": ["[email protected]"],
    "validUsers": {}
}

и затем запустить облачную функцию, чтобы проверить, когда пользователь зарегистрировался, если его электронная почта была в действительном списке электронной почты. Если это было так, то он добавил их в список допустимых пользователей, а если нет, то удалил вновь созданного пользователя. Я также установил правила данных, чтобы только пользователи в validUsers могли получить доступ к данным.

Затем интерфейс обрабатывал перенаправление и т. Д. Для недопустимых пользователей.

 Aníbal Rivero01 дек. 2017 г., 15:16
Не могли бы вы уточнить, как у вас «запускается облачная функция для проверки, когда пользователь зарегистрировался, был ли его адрес электронной почты в действительном списке адресов»? Спасибо!
 Matt Sanders03 дек. 2017 г., 19:09
@ AníbalRivero Firebase позволяет писатьоблачные функции который в основном просто javascript, который работает на сервере node.js. Они подключаются к конкретным действиям и позволяют запускать код в ответ на что-то. В моем примере выше, я используюfunctions.auth.user().onCreate() проверить, есть ли у пользователя, который только что зарегистрировался, электронная почта в списке действительных электронных писем. Если нет, это удаляет их.

"whitelist": {
   "[email protected]%2Ecom": true,
   "[email protected]%2Ecom": true
 }

Поскольку точки не разрешены в ключах, вам нужно экранировать строки с периодами перед их сохранением.

Тогда в базе данных правил:

{
    "rules": {
        "whitelist": {
            ".read": false,
            ".write": false
        },
        ".read": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()",
        ".write": "root.child('whitelist').child(auth.token.email.replace('.', '%2E')).exists()"
    }
}

Электронная почта пользователя доступна черезauth.token.email, Вам нужно убежать от точек (. ->%2E) и проверьте, существует ли ключ в белом списке.

Эти правила не разрешают кому-либо читать или писать доступ к/whitelist раздел базы данных. Модификация возможна только через консоль Firebase.

Ваш ответ на вопрос