【问题标题】:Is it possible to pass data to Firestore within a read-operation to check if the read-op. is allowed based on that data in 'security rules'?是否可以在读取操作中将数据传递到 Firestore 以检查是否读取操作。是否允许基于“安全规则”中的数据?
【发布时间】:2021-08-26 18:28:00
【问题描述】:

我想根据 Firestore 中存储的正确答案安全地检查用户的给定答案。首先,我认为我可以检查是否存在具有用户给定答案的文档,但是通过像这样迭代集合来获取所有文档 ID 及其字段非常容易:

db.doc(`quizzes/quiz1`).collection('question1').get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
          console.log('doc.id: ' , doc.id)
          console.log('doc.data: ' , doc.data())
    })
})

我可以想象通过首先将 givenAnswer 写入特定 userDocument 中的 Firestore 来实现我的需要,然后检查安全规则中的读取操作,如果该值与 correctAnswer 相同,但它会花费额外的费用写操作...

所以我认为必须有一种方法可以在读取操作中传递 givenAnswer 并在 givenAnswer 和 correctAnswer 匹配时检查安全规则。

阅读有关为用户创建自定义令牌的信息,但我不确定这是否可行(我不知道这些令牌如何工作......)因为有必要更改自定义令牌的值每次新尝试比较给定的答案。

希望有人能解决我正在尝试做的事情

非常感谢!

【问题讨论】:

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


    【解决方案1】:

    我不确定我是否完全了解您的数据库的结构,但假设您将所有答案存储在某个单独的集合中,并且答案包含原始问题的链接或引用(例如 questionID),您可以运行匹配两者的复合查询:

    db.collection('answers').where("questionID","==",givenQuestionID).where("correctAnswer","==",givenAnwser)
    

    如果您没有收到任何结果,则表示答案不正确。这将比每次提取整个集合便宜得多。如果您有多个想要接受的答案,可以将它们存储在一个数组中并使用array_contains 查询来查看 givenAnswer 是否与任何已批准的答案匹配。

    您可以在此处阅读有关不同查询选项的更多信息: https://firebase.google.com/docs/firestore/query-data/queries#simple_queries

    【讨论】:

      【解决方案2】:

      我认为在 read 的 Firestore 规则操作中没有类似的东西。使用writing 操作,您可以只使用您写入的数据进行检查。

      我可以想象您可以使用两种解决方案。两者都包含 Firebase 云功能:

      1 - 何时以及如果您的用户将答案写入 firestore,只需使用云功能将其与正确的答案进行对比,并将其标记为正确或错误。这样,用户就不需要访问答案了。

      2 - 如果要检查 asnwer 是否正确,请使用可调用的云函数来调用它们。您只需发送答案,它会回复您是否正确。

      客户用户无法更改其自定义声明。它们存储在身份验证令牌中。您仍然需要调用云函数来设置或更新它们。

      【讨论】:

      • 非常感谢!我将尝试使用选项 2。猜猜这会奏效。
      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      相关资源
      最近更新 更多