Firebase云Firestore限制用户访问(银行应用程序)

Firebase云Firestore限制用户访问(银行应用程序),firebase,firebase-authentication,google-cloud-firestore,firebase-security,Firebase,Firebase Authentication,Google Cloud Firestore,Firebase Security,我正在使用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, wr

我正在使用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;
    }
  }
}
我的数据库结构如下:

/消费者/{consumer\u id}/transactions/{transaction\u id}

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


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

没有办法将Firestore的访问权限限制为仅使用您的应用程序的用户。任何拥有Firebase项目配置数据的人都可以调用该项目中的API。一旦你发布你的应用程序,你就可以与那些用户共享配置数据。因此,您必须假设某些恶意用户会在某个时候调用您项目上的API而不使用您的应用程序

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

一些例子:

  • 每个交易文档可能包含发布该交易的用户的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时发布交易。您可能需要进一步验证,例如是否有他们的帐户文档,或者您是否以某种方式验证了他们的帐户。所有这些通常都可以通过服务器端安全规则来完成

    有关这方面的更多信息,请参阅、pro系列和此

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

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


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

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

一些例子:

  • 每个交易文档可能包含发布该交易的用户的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时发布交易。您可能需要进一步验证,例如是否有他们的帐户文档,或者您是否以某种方式验证了他们的帐户。所有这些通常都可以通过服务器端安全规则来完成

    有关这方面的更多信息,请参阅、pro系列和此

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

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


谢谢你的回答!即使我限制每个用户只修改他们的文档,并且在添加新事务时使用云函数触发器,他们是否仍然可以使用REST端点创建假事务?如前所述:无法限制用户可以调用的特定应用程序或SDK。您需要在后端(使用我指定的任何选项)确保事务有效。谢谢您的回答!即使我限制每个用户只修改他们的文档,并且在添加新事务时使用云函数触发器,他们是否仍然可以使用REST端点创建假事务?如前所述:无法限制用户可以调用的特定应用程序或SDK。您需要在后端(使用我命名的任何选项)确保事务有效。