Нет ничего встроенного в правила безопасности Firebase Authentication или Cloud Firestore, чтобы указать, с какой платформы поступает запрос.Если честно, это звучит довольно небезопасно: если пользователю не нужно входить в ваше веб-приложение, что мешает всем пользователям использовать это веб-приложение?
Но если вы действительно хотите реализовать эту функцию, самый простой способ сделать это - использовать анонимную аутентификацию в веб-приложении.При анонимной аутентификации пользователь входит в систему без необходимости вводить какие-либо учетные данные:
firebase.auth().signInAnonymously()
Теперь в ваших правилах безопасности вы можете просто проверить наличие любого аутентифицированного пользователя:
allow read, write: if request.auth.uid != null
Эторазрешает любому аутентифицированному пользователю доступ к данным: из веб-приложения это будут анонимные пользователи, а из нативных приложений это будет любой метод входа, который вы там реализовали.
После добавления других методов входак веб-приложению вы можете обновить анонимную учетную запись пользователя, связав провайдеров с одной учетной записью .
Справедливое предупреждение, хотя ничто не мешает пользователям создавать свои собственные приложения изапустить его против конфигурации вашего проекта.Таким образом, они могут создать приложение для Android / iOS, которое также использует анонимную аутентификацию.Если вы хотите предотвратить это, все становится немного сложнее ...
Вот один из способов сделать это:
- В веб-приложении зарегистрируйте пользователя с помощью анонимного доступа.аутентификация.Это означает, что пользователю не нужно вводить учетные данные
- . В веб-приложении отправьте запрос в Облачную функцию , которую вы создаете.
- В Облачной функции,убедитесь, что запрос поступает из вашего веб-приложения.У меня нет никаких рекомендаций, поскольку он не имеет отношения к Firebase.
Если запрос поступает от веб-клиента, добавьте настраиваемое требование в учетную запись пользователя, идентифицирующую пользователя какпользователь сети.
admin.auth().setCustomUserClaims(uid, { isWebUser: true })
Как только клиент обновляет свой токен (это может занять до часа, если вы не заставите его обновить ), пользовательское требованиебудет присутствовать во всех запросах, которые он делает.Таким образом, вы можете с этого момента проверить претензию в правилах безопасности вашего Firestore:
allow read, write: if request.auth.token.isWebUser == true;