【问题标题】:How to query Firestore from client?如何从客户端查询 Firestore?
【发布时间】:2020-01-23 16:46:59
【问题描述】:

我正在通过身份验证为 Firebase 应用制定安全规则。

我希望只有用户能够访问他自己的用户文档。

我有这个安全规则:

  match /users/{uid} {
  allow read, update: if request.auth.uid == uid;
  allow create: if request.auth.uid != null;
  }

但是当我运行客户端代码时,它给出了错误:

[Firestore]:状态{code=PERMISSION_DENIED, description=Missing 或 权限不足。,cause=null}

在客户端代码中,我检查具有用户 uid 的文档是否已经存在(如果不存在,我将数据写入 firestore):

final QuerySnapshot result = await Firestore.instance
    .collection('users')
    .where('uid', isEqualTo: user.uid)
    .getDocuments();
documents = result.documents;
if (documents.isEmpty) {
…

为什么会出现这个错误?

我已经阅读了https://firebase.google.com/docs/firestore/security/rules-query,它说db.collection("stories").where("author", "==", user.uid).get() 是有效的。

【问题讨论】:

  • 可能是你没有正确添加依赖?
  • @Abby 感谢您的回复!我添加了正确的

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


【解决方案1】:

您的查询不符合您的规则。该查询要求所有文档字段uid 与user.uid 相同的文档。但是您的规则是允许对文档 ID 与用户的 UID 相同的文档进行读取访问。这些不是一回事。查询处理的是一个名为uid 的文档字段,而规则处理的是文档ID。查询和规则必须匹配。由于您没有说明文档的结构,或者您想要实现的具体目标,因此无法推荐和替代。无论如何,您的查询必须符合规则,否则每次都会失败。

【讨论】:

  • 感谢您的回复!我想检查document id == uid 的文档是否存在于users/ 集合中。我该怎么办?
  • 那么你需要改变你的查询来做你所说的。您必须使用其 ID 为文档构建一个 DocumentReference,然后 get() 它。
【解决方案2】:

在您执行此请求时,您的用户似乎没有经过身份验证,您确定您实现了authentication engine + 首先对用户进行了身份验证?

【讨论】:

  • 感谢您的回复!不,用户首先验证正确。我确定
猜你喜欢
  • 2022-01-23
  • 2017-12-05
  • 2019-12-23
  • 1970-01-01
  • 2017-04-07
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
相关资源
最近更新 更多