Как я могу указать правило безопасности для пожарного хранилища на основе платформы устройства? - PullRequest
0 голосов
/ 17 января 2019

У меня есть база данных в firestore, которая подключена к приложению Android, iOS и веб-сайту. Теперь для всего этого нам нужно войти в систему для доступа к данным.

Мой вопрос: как мы можем определить правило

  1. для приложений Android и iOS, чтобы пользователи могли войти в систему для доступа к данным.

  2. И еще одно правило для веб-сайта, позволяющее пользователям, имеющим доступ к веб-сайту, решать, входить в систему или нет, но по-прежнему иметь доступ к данным.

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 17 января 2019

Нет ничего встроенного в правила безопасности Firebase Authentication или Cloud Firestore, чтобы указать, с какой платформы поступает запрос.Если честно, это звучит довольно небезопасно: если пользователю не нужно входить в ваше веб-приложение, что мешает всем пользователям использовать это веб-приложение?


Но если вы действительно хотите реализовать эту функцию, самый простой способ сделать это - использовать анонимную аутентификацию в веб-приложении.При анонимной аутентификации пользователь входит в систему без необходимости вводить какие-либо учетные данные:

firebase.auth().signInAnonymously()

Теперь в ваших правилах безопасности вы можете просто проверить наличие любого аутентифицированного пользователя:

allow read, write: if request.auth.uid != null

Эторазрешает любому аутентифицированному пользователю доступ к данным: из веб-приложения это будут анонимные пользователи, а из нативных приложений это будет любой метод входа, который вы там реализовали.

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


Справедливое предупреждение, хотя ничто не мешает пользователям создавать свои собственные приложения изапустить его против конфигурации вашего проекта.Таким образом, они могут создать приложение для Android / iOS, которое также использует анонимную аутентификацию.Если вы хотите предотвратить это, все становится немного сложнее ...

Вот один из способов сделать это:

  1. В веб-приложении зарегистрируйте пользователя с помощью анонимного доступа.аутентификация.Это означает, что пользователю не нужно вводить учетные данные
  2. . В веб-приложении отправьте запрос в Облачную функцию , которую вы создаете.
  3. В Облачной функции,убедитесь, что запрос поступает из вашего веб-приложения.У меня нет никаких рекомендаций, поскольку он не имеет отношения к Firebase.
  4. Если запрос поступает от веб-клиента, добавьте настраиваемое требование в учетную запись пользователя, идентифицирующую пользователя какпользователь сети.

    admin.auth().setCustomUserClaims(uid, { isWebUser: true })
    
  5. Как только клиент обновляет свой токен (это может занять до часа, если вы не заставите его обновить ), пользовательское требованиебудет присутствовать во всех запросах, которые он делает.Таким образом, вы можете с этого момента проверить претензию в правилах безопасности вашего Firestore:

    allow read, write: if request.auth.token.isWebUser == true;
    
...