在此处寻找最佳实践建议。我已经习惯了传统的前端/后端设置,因此在客户端执行过多的规则强制操作让我有些担心:)
我正在构建一个应用程序(React Native),用户可以通过以下两种方式更新Firestore数据库中的内容:
他们可以编辑users
Firestore集合中的用户个人资料数据。当他们使用Facebook登录时,我想将所有相关的Facebook个人资料字段都复制到用户个人资料中。
他们可以针对应用程序中显示的特定主题投票。投票将匿名存储在votes
集合中。投票应包含用户的年龄和位置。用户只能对一个主题投票一次(在firestore集合中为每个用户保留一个已投票主题列表),并且只能对不太旧的主题投票。
因此,超级简单的方法是仅使用更新的用户配置文件数据(从Facebook返回)调用第一个Firestore firestore().collection('users').doc(user.uid).set({...})
和firestore().collection('votes').add({...})
命令并进行投票。
但是,这对我来说似乎有点不对劲。如果我们使用facebook作为年龄和位置的真实来源,那么由客户负责从facebook返回的字段并在保存在firestore中的文档中设置值似乎是不对的。如果客户端逻辑被修改/被黑,我们可能会将错误的数据保存到配置文件中。
但更重要的是:如果我们只允许对较新主题和用户尚未进行投票的主题进行投票,那么如何防止客户端将过期或已投票的主题的恶意投票发送给firestore?
例如,或者是投票中的年龄不是用户个人资料数据中年龄的副本的投票? (客户端应用具有用户身份验证令牌和所有Firebase凭证)。我已经发现并非所有这些限制都可以仅通过使用Firestore安全规则来强制执行
无论如何,我当时正在考虑仅调用Firebase云函数进行投票,然后该函数将基于firestore中的数据验证操作,并在满足所有要求的情况下创建投票文档。
但是该解决方案的缺点是什么?据我了解,就网络中断而言,向Firebase / firestore读写数据非常可靠,因为它会在离线时立即同步在脱机时创建的数据。
但是,如果我直接调用httpsCallable
云功能,我猜想它只有在应用程序具有稳定的网络连接时才能工作。
你们还有其他想法吗?