【问题标题】:Firebase Firestore missing or insufficient permissions using Expo (React Native)使用 Expo(React Native)的 Firebase Firestore 缺少或权限不足
【发布时间】:2018-06-11 19:11:56
【问题描述】:

我一直在将 FireStore 用于在浏览器中运行良好的项目,但是当我将代码移植到 Expo,在模拟器中的 iOS 11.2 iPhone X 上运行时,它不断提高 Error: Missing or insufficient permissions.

身份验证工作正常,当我在 Firestore 集合对象中检查客户端时,设置了适当的 UID,并在浏览器中测试相同的代码,一切正常(没有权限问题)。我想说的是,我 95% 确定问题出在 Firebase lib/react native/expo 组合上,而不是我的代码上。特别是因为似乎在浏览器中调用 Firestore,设置了标头,但是在 Reactotron(来自 Expo)中调试调用时,看起来 Firebase 库进行的调用根本没有标头。

我怀疑它会有所作为,但这是我的身份验证规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /UserData/{userID} {
      allow read, write: if request.auth.uid == userID;
    }
    match /MemberData/{userID} {
      allow read: if request.auth.uid == userID;
    }
  }
}

我试图拨打的电话(文档中肯定有数据)如下:

profile = (await UserDataCollection.doc(`${idToken.uid}`).get()).data();

我很好奇是否有其他人遇到过这个问题,如果有,是否有任何解决方法可以让 Firestore 正常工作?

【问题讨论】:

  • 我遇到了与您所面临的完全相同的问题。自从我升级 react-native(从 0.35 到 0.51,我知道有很多变化)以来,它就一直在发生。我已经在Stack Overflow post 中发布了有关它的信息。我知道这不是我的安全规则,因为旧版本运行良好。我只是将 Firebase web api 与 React native 一起使用。到目前为止,我还无法确定问题,但我假设这是一个不正确/过期的身份验证标头的问题。
  • @JamesR 很高兴听到我不是唯一一个。我在踢自己,试图弄清楚有什么不同。我不确定如何最好地分析 React Native 中的请求,但我已经给了 Reactotron 一个镜头,似乎 Firestore 请求根本没有设置任何标头。我很好奇您的 Firestore 请求是否也是这样?
  • 根据我的链接帖子,我使用 Charles 拦截和检查我的请求,从我可以看到它看起来像我的标头被设置(但没有简单的方法来判断它们是否正确就 Firestore 而言)。不过,Charles 并不是最漂亮的 UI,所以我可能遗漏了一些东西
  • 我因睡眠不足而有点精神错乱,但我设法通过从 4.8.1 降级到 4.6.2 来解决这个问题。我真的很好奇为什么会发生这种情况,我在 Charles 中注意到的唯一奇怪的事情是最新版本是 always 发送不记名令牌,并且它似乎有一个奇怪的身份验证标题“X -Goog-Api-Client:gl-js/fire/4.8.1"(注意空格)。降级版本似乎没有发送 auth 标头,而只是发送 sessionId。我现在就这些了,等我明天休息好再去看看。您使用的是哪个版本的 Firebase?
  • @JamesR 太棒了!降级到 4.6.2 似乎也对我有用。我不知道我需要花多少时间去挖掘,看看是什么具体的变化导致了这种情况的发生,但我会看看我是否可以在接下来的几周内看看。如果您发现了,很高兴听到您的发现!

标签: ios react-native firebase-security google-cloud-firestore expo


【解决方案1】:

根据之前的 cmets,降级到 4.6.2 似乎可以解决问题。我不确定确切的根本原因,但发送身份验证标头的行为似乎已经改变(所以可能有什么东西?)。如果我有时间进一步调查,我会更新我的答案。很高兴 Firebase 团队中的一个人与我联系以获取我的帐户详细信息,如果他们想在他们这边进行验证。

【讨论】:

  • 我也可以确认这一点。我从 4.10.1 降级到 4.6.2 并且安全规则起作用了!
  • 感谢修复 - 与最新的 Firebase 4.11.0 出现相同的错误。但是,是的,最好找到最新的修复程序。
  • 这是一个巨大的解脱——我从 4.12.1 降级到 4.6.2 并且它起作用了。对于它的价值,在我这样做之前,我确实尝试将我的登录方法从 signInAndRetrieveDataWithEmailAndPassword 更改为仅 signInWithEmailAndPassword,看看这是否可能是问题(我知道前者将重命名为后者;请参阅firebase.google.com/docs/reference/js/…)。这没有帮助;唯一对我有用的是降级到 4.6.2。
  • 这里正在跟踪这个问题,两天前有一个待处理的拉取请求:github.com/firebase/firebase-js-sdk/issues/703
  • 我只想对此添加评论。这对我来说神奇地在 Android 上突然出现,我通过碰到 5.3.1 解决了它。我不知道为什么会这样(也许 Firebase 团队正在改变他们在后端解析 auth 标头的方式,我不知道),但这非常令人沮丧,并且没有给我很大的信心将任何东西投入生产。我知道它仍处于测试阶段,但对于应用程序开发而言,这意味着我必须推出新版本并在用户无法创建内容时遭受差评。我希望 Firebase 团队对此发表评论
猜你喜欢
  • 2020-11-24
  • 2022-01-25
  • 2019-02-26
  • 2018-04-25
  • 2020-09-01
  • 2020-09-08
  • 2022-01-15
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多