【问题标题】:Uncaught Error in snapshot listener: FirebaseError: [code=permission-denied]: Missing or insufficient permissions快照侦听器中的未捕获错误:FirebaseError:[code=permission-denied]:缺少或权限不足
【发布时间】:2023-01-10 21:43:40
【问题描述】:

我有以下 Firestore 侦听器:

firestore
        .collection('conversations')
        .where('id', '==', 'someId')
        .onSnapshot(callback)

为集合设置以下规则:

match /conversations/{document} {
        allow read: if (request.auth.uid in resource.data.userIds) == true;
        allow write: if (request.auth.uid in resource.data.userIds) == true

当我在 useEffect() 中插入此侦听器时,出现错误: @firebase/firestore: Firestore (9.15.0): Uncaught Error in snapshot listener: FirebaseError: [code=permission-denied]: Missing or insufficient permissions.

为什么我确定已登录并且登录用户的 userId 也在 userIds 对话数组中?

【问题讨论】:

  • 除了我的回答,我认为这个resource 会有所帮助。

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


【解决方案1】:

您的安全规则设置为允许在 conversations 集合中读取文档,其中经过身份验证的用户的 UID 存在于 userIds 数组中,而您的查询尝试从同一集合返回文档,其中 id 字段的值为等于someId值。由于规则设置为允许您执行的操作以外的操作,因此 Firebase 服务器拒绝该操作,因此失败。

要创建满足您的规则的查询,您必须使用 array-contains 运算符:

firestore
    .collection('conversations')
    .where('userIds', 'array-contains, uid)
    .onSnapshot(callback)

其中 uid 是经过身份验证的用户的 UID。

【讨论】:

  • 啊好吧,那行得通,但我还添加了.where('id', '==', 'someId'),所以我只过滤那个文档。谢谢!
  • 很高兴听到它有效:)
  • 那么我的回答有帮助吗?我可以帮助您了解其他信息吗?
猜你喜欢
  • 2021-03-10
  • 2022-08-06
  • 2022-06-10
  • 2021-06-20
  • 2019-10-23
  • 2018-03-26
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多