首页 > 解决方案 > Firebase Cloud Firestore 限制用户访问(银行应用程序)

问题描述

我正在使用 firebase cloud firestore 开发银行应用程序。我已经设置了这样的规则:

// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

我的数据库结构如下:

/consumers/{consumer_id}/transactions/{transaction_id}

{consumer_id} 将包含该消费者的帐户余额以及其他详细信息,而 {transaction_id} 将包含有关每笔交易的详细信息。

因此,如果任何经过身份验证的用户想说提款,他们可以使用 android 应用程序/Web 应用程序这样做。问题是,同一用户能否在我不知情的情况下使用他们的凭据和 REST 端点访问数据库(例如:更新他们的账户余额)?如果是这样,我该如何阻止他们这样做?

标签: firebasefirebase-authenticationgoogle-cloud-firestorefirebase-security

解决方案


无法将访问 Firestore 的权限仅限于使用您的应用的用户。任何拥有 Firebase 项目配置数据的人都可以调用该项目中的 API。一旦你发布你的应用程序,你就会与这些用户共享配置数据。因此,您必须假设某些恶意用户会在不使用您的应用程序的情况下调用您项目的 API。

出于这个原因,您应该强制执行您在受信任环境中拥有的所有业务规则,例如您的开发机器、您控制的服务器、Cloud Functions 或...服务器端安全规则。由于没有用户可以访问其中任何一个,即使他们运行自己的代码,他们也将被迫遵守您的业务规则。

一些例子:

  • 每个交易文档可能包含发布该交易的用户的 UID,当然用户应该只能使用自己的 UID 发布交易。您可以通过以下方式在安全规则中强制执行此操作:

    match /databases/{database}/documents {
      match /consumers/{consumer_id}/transactions/{transaction_id}/ {
        allow write: if request.resource.data.posted_by == request.auth.uid;
      }
    }
    

    因此,现在任何人(无论他们是否使用您的应用程序)都只能在该文档包含他们自己的 UID 时发布交易。您可能需要验证更多信息,例如是否有他们的帐户文件,以及您是否以某种方式验证了他们的帐户。所有这些通常都可以通过服务器端安全规则来完成。

    有关这方面的更多信息,请参阅有关访问安全规则中的其他文档的文档、有关构建安全应用程序的专业系列视频以及有关安全规则的此视频。

  • 由于您将每个帐户的余额保存在其父文档中/consumers/{consumer_id},因此每当在其下过帐交易时,您都需要更新该文档。虽然这在安全规则中是可能的,但它会涉及很多。在服务器端代码中执行余额更新会更容易。

    一个很好的解决方案是将更新余额的代码作为云函数运行,该函数在创建交易时触发(和/或在您允许的情况下更新)。由于此代码在受信任的环境中运行,因此您可以确定只有您可以修改它,因此它可以安全地更新新/修改交易的余额。


推荐阅读