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

firestore security rules for server side requests

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

Note: The server client libraries bypass all Cloud Firestore Security Rules and instead authenticate through Google Application Default Credentials. If you are using the server client libraries or the REST or RPC APIs, make sure to set up Identity and Access Management (IAM) for Cloud Firestore.

以上评论来自 link firebase 团队。听起来评论中的 'server client libraries' 或 api 表示来自我的移动应用程序外部的请求,并且它们会绕过云 Firestore 安全规则。但是,当我在未经许可的情况下尝试使用 Postman 发出相同的 get 请求时,我的应用程序中的请求只是相同的请求,Postman 控制台中的响应很好,这意味着出现了权限被拒绝的错误。

那么,我的问题来了。我希望知道什么类型的请求到底相当于官方参考中提到的这些 'server client libraries' 或 'the REST or RPC APIs' 绕过所有安全规则。在这种情况下,Postman 正好是 'the REST',而 firebase 完全按照我想要的方式工作(产生了权限拒绝)。所以一定有一些特定的类型是 firebase 团队实际打算参考的。

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

希望一些firebase高手能够以丰富的知识和经验为这个问题提供精彩的答案!提前谢谢你 [:

正如其名称所示,服务器客户端库将从服务器或“受信任的环境”(如 Cloud Functions)中使用。

当您从您的服务器(或您的受信任环境)与 Firebase 服务器交互时 API您不需要像从客户端应用程序进行身份验证那样进行身份验证。您的服务器不应使用通过 Firebase 身份验证服务创建的用户帐户(例如 email/password 帐户),而应使用 Firebase 文档中的 Google service accounts. More details here

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

因此,当您的服务器(或您的 Cloud Functions)与 Firebase 服务器 APIs 交互时,由于它是通过服务帐户进行身份验证的,因此请求会绕过所有 Cloud Firestore 安全规则。换句话说,如果你想根据特定的 parameters/values 实现对 allow/forbid 特定操作的一些检查,你必须在你的代码中实现它们。


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

根据它是客户端还是服务器,您应该使用 Firebase 身份验证 ID 令牌或服务帐户(连同 Google Identity OAuth 2.0 令牌)进行身份验证,如 documentation.

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


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

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