存储公开可写数据的方法应该是什么?

时间:2019-11-11 07:30:17

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

我有一个user-profile收藏。当前,只有个人资料可写的用户才能写入。

现在,我想记录“没有访问个人资料的次数”的计数,假设profileVisitedCount。并且,它还会计算非signIn用户是否访问了配置文件。

如果我将计数存储在firebase js客户端库的user-profile集合本身的文档中,则必须使其可公开写入。

我正在考虑的其他选择是具有云功能。它只会使profileVisitedCount递增而无需使文档可公开写。但不确定是否正确,因为云功能端点似乎仍然很脆弱,可以被bot调用。

此外,是的,“配置文件访问计数”类型的数据应记录在GA等分析中,但我需要将此计数用于一种业务逻辑,例如显示访问量最大的配置文件。

那么,关于如何组织数据的任何指导?谢谢!

1 个答案:

答案 0 :(得分:2)

您可能有另一个集合,例如,profileVisitsCounters,其中每个用户存储一个文档,其中文档ID与用户ID相对应。在此用户文档中,您维护一个专用的profileVisitedCount字段,每次用户阅读相应的配置文件时,都用increment()更新。

您使用allow read, write: if true;分配了对此集合的完全读写访问权限。


在您的问题中,提到云功能解决方案时,您写道:“云功能端点似乎仍然很脆弱,可以被bot调用”。请注意,如上文所述,在具有完全写访问权的额外集合的情况下,情况也会如此:例如,知道集合名称和用户uid的人可以调用update()方法JavaScript SDK或Cloud Firestore API的端点,甚至更简单。


如果您想避免这种风险,可以使用callable Cloud Function来阅读用户配置文件,正如您所提到的。该云功能将:

  1. 获取用户个人资料数据;
  2. 增加profileVisitedCount字段(在“用户个人资料”文档中);
  3. 将用户配置文件数据发送回客户端。

您需要拒绝对user-profile集合的读取访问权限,以强制用户通过Cloud Function“读取”它。

这样,您可以确保profileVisitedCount字段仅在读取“真实”用户配置文件时才递增

还请注意,如果拥有两个不同的集合为您的业务案例带来了一些额外的优势,那么您仍然可以保留profileVisitsCounters集合。在这种情况下,Cloud Function将在此集合中增加计数器,而不是在用户配置文件本身中增加计数器。由于云功能会绕过安全规则,因此您将profileVisitsCounters集合的访问权限限制为只读。 (allow read: if true; allow write: if false;


最后,请注意,阅读此article可能会很有趣,其中除其他外,详细介绍了使用Cloud Functions查询Firebase数据库的利弊。