如何根据设备平台为 Firestore 指定安全规则?

Posted

技术标签:

【中文标题】如何根据设备平台为 Firestore 指定安全规则?【英文标题】:How can I specify a security rule for firestore based on device Platform? 【发布时间】:2019-06-11 16:07:22 【问题描述】:

我在 Firestore 中有一个数据库,它连接到 android 应用、ios 应用和网站。现在对于所有这些,我们需要登录才能访问数据。

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

    适用于 Android 和 iOS 应用,以便用户登录以访问数据。

    还有一条网站规则,让访问网站的用户可以决定是否登录,但仍然可以访问数据。

谁能帮帮我?

【问题讨论】:

【参考方案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;
    

【讨论】:

谢谢先生。这对我帮助很大。谢谢。

以上是关于如何根据设备平台为 Firestore 指定安全规则?的主要内容,如果未能解决你的问题,请参考以下文章

MQTT 服务器安全性测试

ATFX安全知识:被骗维权需准确,规避难追回亏损

包含数组的查询的 Firestore 安全规则

安规耐压与漏电流

在 Cloud Firestore 中如何制作一个,只创建一次安全规则

下载管理器在 Android Pie 9.0 NetworkSecurityConfig 中不起作用:未指定网络安全配置,使用平台默认值