【问题标题】:How can I specify a security rule for firestore based on device Platform?如何根据设备平台为 Firestore 指定安全规则?
【发布时间】:2019-06-11 16:07:22
【问题描述】:
我在 Firestore 中有一个数据库,它连接到 Android 应用、iOS 应用和网站。现在对于所有这些,我们需要登录才能访问数据。
我的问题是我们如何指定规则
适用于 Android 和 iOS 应用,以便用户登录以访问数据。
还有一条网站规则,让访问网站的用户可以决定是否登录,但仍然可以访问数据。
谁能帮帮我?
【问题讨论】:
标签:
web
google-cloud-firestore
firebase-security
【解决方案1】:
Firebase 身份验证或 Cloud Firestore 安全规则没有内置任何内容来指示请求来自哪个平台。老实说,这听起来很不安全:如果用户不必登录您的网络应用程序,那么是什么阻止了所有用户使用该网络应用程序?
但如果您真的想要实现此功能,最简单的方法是在网络应用程序中使用anonymous authentication。使用匿名身份验证,用户无需输入任何凭据即可登录:
firebase.auth().signInAnonymously()
现在在您的安全规则中,您可以简单地检查任何经过身份验证的用户:
allow read, write: if request.auth.uid != null
这允许任何经过身份验证的用户访问数据:在网络应用程序中,这将是匿名用户,而在本机应用程序中,它将是您在那里实现的任何登录方法。
在网络应用中添加其他登录方式后,您可以通过linking the providers to a single user account升级用户的匿名帐户。
虽然没有什么能阻止用户创建自己的应用并根据您的项目配置运行它,但这是公平的警告。因此他们可以创建一个也使用匿名身份验证的 Android/iOS 应用程序。如果你想防止这种情况,事情会变得相当复杂......
这是一种方法:
- 在 Web 应用程序中,使用匿名身份验证登录用户。这意味着用户无需输入凭据
- 在网络应用中,向您创建的Cloud Function 发送请求。
- 在 Cloud Function 中,验证请求是否来自您的 Web 应用程序。我在这里没有指导,因为它与 Firebase 无关。
-
如果请求来自网络客户端,请在用户帐户中添加custom claim,将用户标识为网络用户。
admin.auth().setCustomUserClaims(uid, { isWebUser: true })
-
一旦客户端刷新其令牌(这可能需要长达一个小时,除非您force it to refresh),自定义声明将出现在它发出的所有请求中。因此,您可以从那一刻起检查您的 Firestore 安全规则中的声明:
allow read, write: if request.auth.token.isWebUser == true;