我有一个user-profile
收藏。当前,只有个人资料可写的用户才能写入。
现在,我想记录“没有访问个人资料的次数”的计数,假设profileVisitedCount
。并且,它还会计算非signIn用户是否访问了配置文件。
如果我将计数存储在firebase js客户端库的user-profile
集合本身的文档中,则必须使其可公开写入。
我正在考虑的其他选择是具有云功能。它只会使profileVisitedCount
递增而无需使文档可公开写。但不确定是否正确,因为云功能端点似乎仍然很脆弱,可以被bot调用。
此外,是的,“配置文件访问计数”类型的数据应记录在GA等分析中,但我需要将此计数用于一种业务逻辑,例如显示访问量最大的配置文件。
那么,关于如何组织数据的任何指导?谢谢!
答案 0 :(得分:2)
您可能有另一个集合,例如,profileVisitsCounters
,其中每个用户存储一个文档,其中文档ID与用户ID相对应。在此用户文档中,您维护一个专用的profileVisitedCount
字段,每次用户阅读相应的配置文件时,都用increment()
更新。
您使用allow read, write: if true;
分配了对此集合的完全读写访问权限。
在您的问题中,提到云功能解决方案时,您写道:“云功能端点似乎仍然很脆弱,可以被bot调用”。请注意,如上文所述,在具有完全写访问权的额外集合的情况下,情况也会如此:例如,知道集合名称和用户uid的人可以调用update()
方法JavaScript SDK或Cloud Firestore API的端点,甚至更简单。
如果您想避免这种风险,可以使用callable Cloud Function来阅读用户配置文件,正如您所提到的。该云功能将:
profileVisitedCount
字段(在“用户个人资料”文档中); 您需要拒绝对user-profile
集合的读取访问权限,以强制用户通过Cloud Function“读取”它。
这样,您可以确保profileVisitedCount
字段仅在读取“真实”用户配置文件时才递增。
还请注意,如果拥有两个不同的集合为您的业务案例带来了一些额外的优势,那么您仍然可以保留profileVisitsCounters
集合。在这种情况下,Cloud Function将在此集合中增加计数器,而不是在用户配置文件本身中增加计数器。由于云功能会绕过安全规则,因此您将profileVisitsCounters
集合的访问权限限制为只读。 (allow read: if true; allow write: if false;
。
最后,请注意,阅读此article可能会很有趣,其中除其他外,详细介绍了使用Cloud Functions查询Firebase数据库的利弊。