Firebase云Firestore限制用户访问(银行应用程序)
我正在使用firebase cloud 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
// 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发布交易。您可以通过以下方式在安全规则中强制执行此操作:
因此,现在任何人(无论他们是否在使用你的应用程序)都只能在文档包含自己的UID时发布交易。您可能需要进一步验证,例如是否有他们的帐户文档,或者您是否以某种方式验证了他们的帐户。所有这些通常都可以通过服务器端安全规则来完成 有关这方面的更多信息,请参阅、pro系列和此match /databases/{database}/documents { match /consumers/{consumer_id}/transactions/{transaction_id}/ { allow write: if request.resource.data.posted_by == request.auth.uid; } }
- 由于您将每个帐户的余额保存在其父文档中的
下,因此每当在该文档下过帐交易时,您都需要更新该文档。虽然这在安全规则中是可能的,但它将相当复杂。在服务器端代码中执行此平衡更新将更容易 一个很好的解决方案是将更新余额的代码作为云函数运行,该云函数在创建事务时触发(和/或在允许的情况下更新)。由于此代码在受信任的环境中运行,您可以确保只有您可以修改它,因此它可以安全地更新新/修改事务的余额/consumers/{consumer\u id}
- 每个交易文档可能包含发布该交易的用户的UID,当然,用户只能使用自己的UID发布交易。您可以通过以下方式在安全规则中强制执行此操作:
因此,现在任何人(无论他们是否在使用你的应用程序)都只能在文档包含自己的UID时发布交易。您可能需要进一步验证,例如是否有他们的帐户文档,或者您是否以某种方式验证了他们的帐户。所有这些通常都可以通过服务器端安全规则来完成 有关这方面的更多信息,请参阅、pro系列和此match /databases/{database}/documents { match /consumers/{consumer_id}/transactions/{transaction_id}/ { allow write: if request.resource.data.posted_by == request.auth.uid; } }
- 由于您将每个帐户的余额保存在其父文档中的
下,因此每当在该文档下过帐交易时,您都需要更新该文档。虽然这在安全规则中是可能的,但它将相当复杂。在服务器端代码中执行此平衡更新将更容易 一个很好的解决方案是将更新余额的代码作为云函数运行,该云函数在创建事务时触发(和/或在允许的情况下更新)。由于此代码在受信任的环境中运行,您可以确保只有您可以修改它,因此它可以安全地更新新/修改事务的余额/consumers/{consumer\u id}