在使用firestore权限的本机应用程序(通过Expo)中,request.auth始终为null

时间:2017-12-17 20:41:35

标签: firebase react-native firebase-authentication google-cloud-firestore

这是我的代码:

firebase.auth().onAuthStateChanged((user) => {
    if (user) {
        console.log("We are authenticated now!");
        firebase.firestore().collection("users")
            .doc(firebase.auth().currentUser.uid).set({ name: "new name" });
    } else {
        loginWithFacebook();
    }
});

而且,这是我的许可规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null;
    }
  }
}

似乎无论如何,request.auth始终为null。 我得到的错误:

  

Firestore(4.8.0)2017-12-20T04:18:27.321Z [连接]:WebChannel   收到错误:{"代码":403,"消息":"遗失或不足   权限""状态":" PERMISSION_DENIED"}

7 个答案:

答案 0 :(得分:3)

当我在Expo上遇到最新的Firebase JS SDK问题时,我降级到Firebase SDK 4.6.2。

此外,您必须执行此操作才能使一切正常工作:

复制https://gist.githubusercontent.com/mikelehen/444950a35019208f3aaf18d37ab4937c/raw/85ac4cb3108d92163cb8f04fbdddcc88d4081aab/index.js

超过node_modules/@firebase/webchannel-wrapper/dist/index.js

如果没有这个,你将从你的收藏中得不到任何东西。

希望这有帮助。

答案 1 :(得分:3)

我将来自浏览器vs expo中运行的相同代码的请求区分开来。我注意到的一个区别是缺少Origin标头。我修补了xhr,它适用于我的用途。我不确定这是一个错误还是预期的行为。我已经询问过slack / firestore和discord / react-native,但没有得到多少意见。

const xhrInterceptor = require('react-native/Libraries/Network/XHRInterceptor')
xhrInterceptor.setSendCallback((data, xhr) => {
  if (xhr._method === 'POST') {
    // WHATWG specifies opaque origin as anything other than a uri tuple. It serializes to the string 'null'.
    // https://html.spec.whatwg.org/multipage/origin.html
    xhr.setRequestHeader('Origin', 'null')
  }
})
xhrInterceptor.enableInterception()

答案 2 :(得分:1)

似乎是一个错误 - 正如其他高信誉用户所经历的那样。当我们找到修复程序时,我会更新更新。如果有人让它工作(通过世博会反应原生)请分享。

答案 3 :(得分:0)

对不起,我参加聚会很晚,但是我碰到了这一点,以为我会分享我的经验。我遇到了完全相同的问题,经过几个月的研究和调试,当我升级到Firebase v 5时,问题得以解决。这是我的SO帖子和解决方案的链接。希望能帮助到你: https://stackoverflow.com/a/51115385/6158840

答案 4 :(得分:0)

我通过将Firebase版本降级到5.0.0(我使用的是6.4版本)解决了该问题。希望它可以帮助其他人。

  1. 在您的package.json中
dependencies: {
  "firebase": "^5.0.0"
}
  1. 更新依赖项

npm install

答案 5 :(得分:-1)

首先检查FIREBSAE规则Exectuion模拟器上的东西,

其次,您的问题听起来像您的请求未同步, 检查你的规则(如果可能的话)在Web视图中,因为我尝试做同样的事情并且它对我有用

    {
      "rules": {
                ".read": "auth != null",
                ".write": "auth != null"
               }
    }

答案 6 :(得分:-1)

请记录您的UID并确认它不为空。然后将权限规则修改为 -

// Grants a user access to a document matching their Auth user Id
    service cloud.firestore {
       match /databases/{database}/documents {
         // Collection named "users", document named after the userId
       match /users/{userId} {
         allow read, write: if request.auth.uid == userId;
       }
     }
  }