【问题标题】:Auth with multiple firebase realtime databases on web not working在网络上使用多个 Firebase 实时数据库进行身份验证不起作用
【发布时间】:2020-06-06 00:11:54
【问题描述】:

我有两个 Firebase 实时数据库。我已经设法从我的基于 Web 的客户端连接、读取和写入它们。但是,我将回顾我的安全规则并进行设置,以便您只有在使用

进行身份验证时才能读/写
  "rules": {
    ".read": "auth.uid != null" ,
    ".write": "auth.uid != null" 
  }

但是,由于某种原因,我现在无法连接到数据库,它说权限被拒绝。我在使用 Google 的客户端上进行了身份验证,其他所有使用 auth 的东西都按预期工作。例如,我能够打印出用户的 uid 和所有内容。这是我拥有的客户端代码(已审查)。

  var firebaseConfig = {
apiKey: "------------------",
authDomain: "-------------",
databaseURL: "-------------",
projectId: "-------",
};
// Initialize Firebase
var app = firebase.initializeApp(firebaseConfig, 'app2');

firebase.database(app).ref('boards').child(boardID).once('value', function(snapshot) {//I do stuff here})

错误:

Error: permission_denied at /boards/id: Client doesn't have permission to access the desired data.
    at util.ts:526
    at onComplete (SyncTree.ts:651)
    at Object.onComplete (Repo.ts:167)
    at PersistentConnection.ts:247
    at si.onDataMessage_ (PersistentConnection.ts:554)
    at ei.onDataMessage_ (Connection.ts:317)
    at ei.onPrimaryMessageReceived_ (Connection.ts:309)
    at $r.onMessage (Connection.ts:205)
    at $r.appendFrame_ (WebSocketConnection.ts:273)
    at $r.handleIncomingFrame (WebSocketConnection.ts:326)

这些是我正在使用的 firebase 脚本

<script src="/__/firebase/7.6.1/firebase-app.js"></script>
<script src="/__/firebase/7.6.1/firebase-database.js"></script>
<script src="/__/firebase/7.8.1/firebase-auth.js"></script>
<script src="/__/firebase/init.js"></script>

这是一个已知的错误吗?我错过了什么吗?谢谢。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database firebase-authentication


    【解决方案1】:

    我通过切换解决了这个问题

    <script src="/__/firebase/7.6.1/firebase-app.js"></script>
    <script src="/__/firebase/7.6.1/firebase-database.js"></script>
    <script src="/__/firebase/7.8.1/firebase-auth.js"></script>
    <script src="/__/firebase/init.js"></script>
    

      <script src="https://code.jquery.com/jquery-latest.min.js"></script>
      <script src="https://www.gstatic.com/firebasejs/7.9.0/firebase-app.js"></script>
      <script src="https://www.gstatic.com/firebasejs/7.9.0/firebase-database.js"></script>
      <script src="https://www.gstatic.com/firebasejs/7.9.0/firebase-auth.js"></script>
    

    并从var app = firebase.initializeApp(firebaseConfig, 'app2'); 中删除, 'app2)

    这使第二个数据库成为默认数据库,现在一切正常。但是,如果曾经在客户端上需要两个数据库引用,这将再次成为一个问题,据我所知,除非 Firebase 开发人员发布补丁,否则无法修复。

    【讨论】:

      【解决方案2】:

      Firebase 身份验证会在您重新加载页面时恢复用户的身份验证状态。这需要调用服务器,这是异步发生的。当您附加侦听器时,很可能身份验证检查尚未完成。

      要解决此问题,请始终在 an onAuthStateChanged callback 中附加需要身份验证的侦听器:

      // Initialize Firebase
      var app = firebase.initializeApp(firebaseConfig, 'app2');
      
      firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
          firebase.database(app).ref('boards').child(boardID).once('value', function(snapshot) {//I do stuff here})
        }
      }
      

      如果您再次遇到类似问题,我建议您记录活动用户的 UID 以帮助进行故障排除:

      console.log(firebase.auth().currentUser ? firebase.auth().currentUser.uid : "No user");
      firebase.database(app).ref('boards').child(boardID).once('value', function(snapshot) {//I do stuff here})
      

      这通常会使安全规则拒绝您的写入的原因一目了然。

      【讨论】:

      • 我仍然收到权限被拒绝错误。我将读取请求放在 authsstatechanged 侦听器中,并打印出 uid 和其余用户信息,果然所有信息都在那里。我也玩过这些规则,所以现在你只有在没有经过身份验证的情况下才能阅读,而且它可以工作。所以由于某种原因,uid 没有与读取请求一起发送。我应该更改 firebaseConfig 中的某些内容吗?
      • 这非常罕见。你觉得可以在jsbin之类的网站上设置一个复现,让我看看吗?
      • 很抱歉代码的混乱程度。我一直在争先恐后地修复这个错误。但这是代码。 jsfiddle.net/t8hLdkv0
      • 当我加载那个小提琴时,它会在 JavaScript 控制台中显示 firebase is not defined。想法是您在我可以查看的网站上重现 permission denied 问题,这是帮助您解决看似异常情况的最快方法。
      • 通过创建第二个数据库并尝试在相同安全规则下读取该数据库,可以轻松重现此问题。我不允许分享有关数据库的任何内容,包括赠送填充的 firebaseConfig JSON。我设法解决了我在上面发布的自己的问题,但如果可能的话(因为我看到你为 Firebase 工作)请调查一下。感谢您的帮助!
      猜你喜欢
      • 2018-06-06
      • 2018-07-15
      • 2018-05-13
      • 1970-01-01
      • 2021-04-28
      • 2017-12-26
      • 1970-01-01
      • 2019-04-23
      相关资源
      最近更新 更多