Как я могу использовать Firebase для безопасного совместного использования данных присутствия в определенной группе?

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

Как я могу разрешить пользователям в этих группах делиться своими данными присутствия и видеть присутствие каждого другого пользователя в группе, но сохранить эти данные из внешнего мира?

Ответ 1

Во-первых, вам нужно будет начать аутентификацию своих пользователей, используя один из поддерживаемых механизмов аутентификации Firebase. Более подробную информацию об аутентификации в Firebase можно найти в https://www.firebase.com/docs/security/authentication.html.

Как только вы начнете аутентификацию пользователей, ваши безопасные проверенные пользовательские данные будут доступны вам в ваших правилах безопасности с помощью переменной auth. Предположим, что у вас есть аутентифицированные пользователи, и каждый пользователь имеет уникальный идентификатор, доступный через auth.uid.

Для совместного присутствия групп я бы рекомендовал хранить ваши данные с помощью такой структуры, как:

/groups/<group-id>/users/<user-id>/<presence-status>

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

{
  "groups": {
    "$groupid": {
      // Users can view the presence state of users in this group if they
      // are authenticated and listed in the group themselves.
      ".read": "auth != null && data.child('users').hasChild(auth.uid)"
      "users": {
        "$userid": {
          // Users can update only their individual account data.
          ".write": "auth != null && $userid == auth.uid && newData.val() != null"
        }
      }
    }
  }
}

В приведенном выше примере только пользователи из /groups/<group-id>/users/ имеют разрешение на просмотр данных о присутствии для группы, и каждый пользователь может изменять только их отдельные данные. Пользователь может читать/писать только своему индивидуальному пользователю node.

Чтобы расширить это немного, позвольте сказать, что у вас есть специальный класс пользователей, которые являются единственными, разрешенными для создания групп. Вы можете включить уровень разрешений пользователя при создании токенов аутентификации (в примере ниже мы установим isAdmin=true) и предоставим специальный уровень доступа с использованием обновленных правил безопасности. Например, если некоторым пользователям разрешено создавать группы, вы можете обновить правило .write в $groupid, чтобы выглядеть так:

"$groupid": {
  // Only admins can create new groups.
  ".write": "auth != null && auth.isAdmin === true"
  //...
}