【发布时间】: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