【问题标题】:Verify custom Firestore fields验证自定义 Firestore 字段
【发布时间】:2021-11-23 11:32:06
【问题描述】:

我们有一个令牌集合 /funTokens,其中每个文档 ID 都是一个令牌 ID,文档数据包含一个 name 字段(令牌 ID 也是一个字段)。

我们希望从 Web (javascript) 查询集合,并且仅当请求包含并匹配 nametoken 字段时才允许访问文档。

注意-有很多令牌,令牌不是用户

示例- 某人应该能够打开 funExample.com/getTokenData?token=123&name=bob url,在 javascript Firestore 查询中,我们将传递这些参数并在安全规则中验证它们。 因此查询将只允许访问此文档:

/funTokens/123: {
    token: 123,
    name: bob,
    stuf: <>
}

有可能吗?

【问题讨论】:

  • 您是要求满足此需求的安全规则还是要求正确的查询?
  • 谢谢!我正在使用以下查询:db.doc(funTokens/${token}).get().then(...) 但我不确定如何将名称插入查询,以及假设是什么安全规则
  • 让我们从查询开始,假设 token_id 是一个持有令牌 id 的变量,请尝试以下db.collection('funTokens').doc(token_id).get().subscribe(token =&gt; token=token) 并告诉我它是否成功。现在,请使用公共安全规则,以便任何人都可以查询
  • 是的,这是有效的
  • 在 firebase 中,您正在查询特定的文档,所以我认为您不能在 get 中插入调用 token_idname。您需要用来确认查询是否包含 token_id 的规则是:match /funTokens/{token_id}{ allow read: if request.path[4] == token_id; } 如果您想更改数据库,还有其他选项可以得到您想要的

标签: google-cloud-firestore firebase-security


【解决方案1】:

假设token_id 是一个保存令牌ID 的变量,查询是:

db.collection('funTokens').doc(token_id).get().subscribe(token => token=token)

在 firebase 中,您正在查询特定的文档,所以我认为您不能在 get 中插入调用 token_idname

您需要用来确认查询是否包含 token_id 的规则是:

match /funTokens/{token_id} {
        allow get: if request.path[4] == token_id;     
} 

但正如@l1b3rty 在评论中提到的那样,这条规则根据定义总是正确的。所以你实际上不需要任何规则接受allow read: true,因为如果请求包含token_id,它就允许读取它。

如果我理解正确,您的安全性建立在这样一个事实之上,即只有允许读取令牌的人应该知道token_id。所以token_id 是一个秘密,所以你需要阻止list 操作,因为allow list 允许用户读取整个集合或查询集合,因此用户将获得所有token_id。所以你应该使用以下规则:

match /funTokens/{token_id} {
        allow get: true;
        allow list: false;
} 

如果你想改变数据库结构,还有其他选项可以得到你想要的

【讨论】:

  • @alon。如果以上答案对您有帮助,请告诉我们。
  • 根据定义,您的规则将始终为真 + 这不是在验证名称
  • @l1b3rty 你是对的。我只是编辑我的答案,请看一下
  • 谢谢!它没有完全解决我的问题,因为它没有解决验证名称的需要,但它会降低风险
【解决方案2】:

您必须想办法在请求中提供名称和令牌。所以我会做以下事情:

  1. 更改文档结构,使文档名称也包含name 字段

    /funTokens/123_bob: {
      token: 123,
       name: bob,
       stuf: <>
    }
    
  2. 那么规则就很简单了:

    match /funTokens/{doc_id} {
      allow get: if true;     
    } 
    

如果您无法更改文档名称,则必须使用云函数

  1. 输入token idname
  2. 使用token id 在 Firestore 中查询文档
  3. 验证名称是否匹配
  4. 根据上一步返回文档内容或错误

【讨论】:

    猜你喜欢
    • 2018-08-05
    • 2014-03-04
    • 2011-02-01
    • 2017-11-17
    • 2015-09-25
    • 2017-06-21
    • 2012-11-30
    • 2012-02-19
    • 1970-01-01
    相关资源
    最近更新 更多