【问题标题】:Save way to create a Firestore document保存创建 Firestore 文档的方法
【发布时间】:2021-02-28 09:07:15
【问题描述】:

我用 JavaScript 制作了一个游戏,其中用户需要特定的时间来完成它。然后我想在那个时候在 Firestone 上的一个名为 scores 的集合中创建一个文档。我的问题是用户可以通过简单地复制和粘贴代码并输入他们自己的值来随机创建无限数量的文档。有没有办法让用户在游戏结束时只能创建一次具有正确时间的文档?这是我使用的代码:

db.collection('score').add({
    time: 122,
});

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    我认为你有两个要求:

    1. 用户应该只能创建一个文档。
    2. 文档中的时间必须是游戏结束时的当前时间。

    每个用户只允许一个文档

    第一个最简单的方法是使用 Firebase 身份验证让用户登录,以便他们拥有身份。如果您不希望用户输入任何凭据,您可以在using anonymous authentication 中签名。

    无论您如何登录,这都会为他们提供唯一的 UID(用户标识符),然后您可以将其用作文档 ID:

    let uid = firebase.auth().currentUser.uid;
    db.collection('score').doc(uid).set({
        time: 122,
    });
    

    因此,我们不是调用add()(每次调用它都会生成一个新文档),而是使用用户的 UID 作为其名称来创建一个文档。这样用户将始终写入同一个文档。

    然后,您可以强制用户只能使用 Firebase 的服务器端安全规则编写自己的文档。有关这方面的示例,请参阅content-owner only access 上的文档。


    确保时间不会被欺骗

    为了防止用户将任何他们想要的值写入数据库,我们可以use Firestore's built-in FieldValue.serverTimestamp marker value。当您在代码中使用它时,Firestore 服务器会自动从服务器写入当前值:

    let uid = firebase.auth().currentUser.uid;
    db.collection('score').doc(uid).set({
        time: firebase.firestore.FieldValue.serverTimestamp(),
    });
    

    您也可以在这里使用 Firebase 的服务器端安全规则来确保恶意用户无法传递他们自己的值。为此,请将正在写入的值 (request.data.time) 与 built-in variable for the current time (request.time) 进行比较。

    【讨论】:

    • 非常感谢。这解决了我的问题:)
    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2019-01-08
    • 2019-02-16
    • 2022-01-22
    相关资源
    最近更新 更多