如何基于设备平台为Firestore指定安全规则?

时间:2019-01-17 12:43:52

标签: web google-cloud-firestore firebase-security

我在firestore中有一个数据库,该数据库已连接到Android App,iOS App和网站。现在,所有这些我们都需要登录才能访问数据。

我的问题是我们如何指定规则

  1. (适用于Android和iOS应用),以便用户应登录才能访问数据。

  2. 网站的另一条规则,以便访问网站的用户可以决定是否登录,但他们仍然可以访问数据。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

Firebase身份验证或Cloud Firestore安全规则没有内置任何内容可指示请求来自哪个平台。老实说,这听起来很不安全:如果用户不必登录您的Web应用程序,那么什么使所有用户无法使用该Web应用程序?


但是,如果您真的想实现此功能,最简单的方法是在网络应用中使用anonymous authentication。通过匿名身份验证,用户无需输入任何凭据即可登录:

firebase.auth().signInAnonymously()

现在,在安全规则中,您只需检查任何经过身份验证的用户即可:

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

这允许任何经过身份验证的用户访问数据:在Web应用程序中将是匿名用户,而在本机应用程序中将是您在此处实现的任何登录方法。

将其他登录方法添加到Web应用程序后,您可以通过linking the providers to a single user account升级用户的匿名帐户。


公平的警告,尽管没有什么阻止用户创建自己的应用并针对您的项目配置运行它。因此,他们可以创建一个也使用匿名身份验证的Android / iOS应用。如果要防止这种情况,事情会变得复杂得多...

这里是一种方法:

  1. 在Web应用程序中,使用匿名身份验证登录用户。这意味着用户不需要输入凭据
  2. 在网络应用中,向您创建的Cloud Function发送请求。
  3. 在Cloud Function中,确认请求来自您的Web应用程序。我这里没有指导,因为它与Firebase无关。
  4. 如果请求来自Web客户端,请向用户帐户添加custom claim,以将用户标识为Web用户。

    admin.auth().setCustomUserClaims(uid, { isWebUser: true })
    
  5. 一旦客户端刷新其令牌(除非您force it to refresh,否则最多可能需要一个小时),因此自定义声明将出现在其提出的所有请求中。因此,从那时起,您可以检查Firestore安全规则中的声明:

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