服务器端请求的 firestore 安全规则

tsi*_*ixe 1 firebase firebase-security flutter firebase-admin google-cloud-firestore

我从去年秋天开始就是 flutter-fire 用户

注意:服务器客户端库绕过所有 Cloud Firestore 安全规则,而是通过 Google 应用程序默认凭据进行身份验证。如果您使用服务器客户端库或 REST 或 RPC API,请确保为 Cloud Firestore 设置身份和访问管理 (IAM)。

上面的评论来自firebase 团队的链接。听起来评论中的“服务器客户端库”或 api 意味着来自我的移动应用程序外部的请求,并且它们会绕过云 Firestore 安全规则。但是,当我在未经许可的情况下尝试使用 Postman 与我的应用程序中的请求进行相同的获取请求时,Postman 控制台中的响应很好,这意味着出现了权限被拒绝错误。

那么,我的问题来了。我希望知道哪些类型的请求到底相当于官方参考文献中提到的这些绕过所有安全规则的“服务器客户端库”或“REST 或 RPC API”。Postman 正是“REST”,在这种情况下,firebase 完美地按照我想要的方式工作(产生了权限拒绝)。因此,Firebase 团队必须要注意一些特定的类型。

我知道 firebase-admin sdk 是可能的服务器端库之一,但是当我们尝试访问 firebase admin sdk 时,应该需要完全相同的权限或身份验证程序,它可以控制高于安全规则的 firebase 数据,就像 firebase 团队评论的那样。因此,问题的重点是攻击者可能在没有适当安全程序的情况下恶意操纵我们的火力点的解决方案。

希望一些 Firebase 专家能够以丰富的知识和经验为这个问题给出很酷的答案!先感谢您 [:

Ren*_*nec 5

顾名思义,服务器客户端库可以从服务器或“可信环境”(如 Cloud Functions)中使用。

当从服务器(或受信任的环境)与 Firebase 服务器 API 进行交互时,您不需要像从客户端应用程序进行身份验证那样进行身份验证。您的服务器不应使用通过 Firebase 身份验证服务创建的用户帐户(例如电子邮件/密码帐户),而应使用Google 服务帐户。更多详细信息参阅 Firebase 文档。

请注意,对于 Cloud Functions,您可以不使用任何参数来初始化 Admin SDK。在这种情况下,SDK 使用 Google 应用程序默认凭据(完全如您在问题中提到的文档摘录中所示)。

因此,当您的服务器(或云功能)与 Firebase 服务器 API 交互时,由于它是使用服务帐户进行身份验证的,因此请求会绕过所有 Cloud Firestore 安全规则。换句话说,如果您想实现一些检查以允许/禁止基于特定参数/值的特定操作,您必须在代码中实现它们。


对于 REST API 来说,也是一样的。REST API 可以从客户端应用程序(Web 应用程序、Flutter 应用程序等)或服务器使用。

根据它是客户端还是服务器,您应该使用 Firebase 身份验证 ID 令牌或服务帐户(以及 Google Identity OAuth 2.0 令牌)进行身份验证,如文档中详细说明

因此,当您在未经许可的情况下使用 Postman 向 API 发出请求时(如您所做的那样),API 会检测到没有与该请求关联的 Google Identity OAuth 2.0 令牌或 Firebase 身份验证 ID 令牌,然后强制执行安全规则 => 您收到“权限被拒绝错误”。


总之,如果您正确定义安全规则,您应该不会遇到“攻击者恶意操纵”您的数据库的任何问题。

但请注意,仅基于安全规则auth != null可能不足以保护您的数据,如本答案中所述。