База данных Firebase - Обмен данными, когда UID неизвестен? - PullRequest
0 голосов
/ 14 декабря 2018

В базе данных Firebase ;Если у user_a есть данные, к которым они могут получить доступ, и они хотят поделиться этими данными с user_b, какова наилучшая практика и структура базы данных для безопасного обмена этими данными между конкретными пользователями?

Важно : user_a не имеет никакой информации о user_b учетной записи, например, uid.


Подробный пример :

1) user_a имеет список клиентов.

"users": {
    "user_a": {
        "clients": [
            "clientUid",
            "clientUid2"
        ]
    }
},
"clients": {
    "clientUid": {
        "firstName": "John",
        "lastName": "Doe"
    },
    "clientUid2": {
        "firstName": "Joe",
        "lastName": "Bloggs"
    }
}

2) user_b подписывается.user_a теперь хочет поделиться user_b данными в clients с учетной записью user_b, которая зарегистрировалась.

Другими словами: user_a имеет список клиентов, один из них создает учетную записьи ему нужна ссылка на информацию, уже введенную для них user_a.


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

Это отличается от ранее заданного 'вопросы, связанные с общими данными, с акцентом на том, как устанавливается связь между двумя пользователями?Не только до и после.

1 Ответ

0 голосов
/ 14 декабря 2018

Я знаю, если два пути:

  • Либо пользователи должны знать определенное значение, известное как общий секрет.
  • Или вы разрешаете пользователям искать друг друга.

Общий секрет

Общий секрет может быть легко смоделирован в базе данных как местоположение, которое вы можете прочитать, как только узнаете его.Ваш короткий уникальный идентификатор является примером такого общего секрета, где user_a «определяет» секрет и затем отправляет его на user_b вне диапазона.

Простой поток:

  1. user_a нажимает кнопку Получить секрет в приложении
  2. Приложение определяет секретный код, например, correct-horse-battery-staple и:

    2a,Записывает секретный код в базу данных в незапрашиваемом, но читаемом месте вместе с фактической информацией для обмена, в вашем случае UID user_a.

    2b.Показывает секретный код для user_a.

  3. user_a копирует код и отправляет его на user_b через какой-либо другой механизм связи, например, текст, электронная почта, чат.

  4. user_b клики Введите секретную кнопку в приложении и вставьте секрет.
  5. Приложение считывает местоположение и может прочитать UID user_a*не позволяйте никому читать /secrets, поэтому они не могут получить список всех секретов.Но как только они знают секрет, они могут искать связанные с ним данные.

    Разрешение поиска

    Альтернативой является список пользователей в вашей базе данных,и позвольте user_b искать какое-либо свойство, которое они знают из user_a.Общим свойством может быть их адрес электронной почты или отображаемое имя, которое можно сохранить в базе данных, например:

    users: {
      "uidOfUserA": {
        email: "userA@domain.com",
        displayName: "user A"
      },
      "uidOfUserB": {
        email: "userB@anotherdomain.com",
        displayName: "user B"
      }
    }
    

    Чтобы пользователи могли искать друг друга, это немного сложнее, например:требуется код на стороне сервера.Причина этого заключается в том, что для поиска по набору данных требуется, чтобы вы могли прочитать этот набор данных.А в Firebase, если вы можете прочитать набор данных, вы можете получить все данные в нем.Другими словами, чтобы разрешить поиск пользователя, вы должны иметь возможность прочитать все /users, и это позволит раскрыть слишком много информации.

    Поэтому для безопасного поиска вам нужно иметь правиланапример:

    {
      "rules": {
        "users": {
          "$uid": {
            ".read": true,
            ".write": "auth.uid === $uid"
          }
        }
      }
    }
    

    Словом: любой может прочитать профиль для пользователя, для которого он знает UID, но каждый отдельный пользователь может изменять только свой собственный профиль.

    При этом,Вы можете реализовать облачную функцию, которая затем принимает электронную почту или отображаемое имя в качестве входных данных и выполняет поиск по всем /users.Поскольку облачные функции обращаются к базе данных с правами администратора, они не ограничены вышеуказанными правилами безопасности.

...