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

时间:2021-05-07 06:57:31

标签: firebase flutter google-cloud-firestore firebase-security firebase-admin

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

<块引用>

注意:服务器客户端库绕过所有 Cloud Firestore 安全 规则,而是通过 Google Application Default 进行身份验证 证书。如果您使用服务器客户端库或 REST 或 RPC API,确保设置身份和访问管理 (IAM) 适用于 Cloud Firestore。

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

那么,我的问题来了。我希望知道哪些类型的请求完全等同于绕过所有安全规则的官方参考中提到的这些“服务器客户端库”或“REST 或 RPC API”。 Postman 正是“REST”,在这种情况下,firebase 完全按照我的意愿工作(产生了许可拒绝)。所以必须有一些特定类型的 Firebase 团队实际上打算参考。

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

希望一些 Firebase 专家能够以出色的知识和经验为这个问题给出很酷的答案!提前致谢 [:

1 个答案:

答案 0 :(得分:2)

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

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

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

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


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

根据是客户端还是服务器,您应该使用 Firebase 身份验证 ID 令牌或服务帐户(连同 Google Identity OAuth 2.0 令牌)进行身份验证,如documentation 中的详细说明。< /p>

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


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

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