Javascript 使用web上的多个firebase实时数据库进行身份验证不起作用
我有两个Firebase实时数据库。我已经成功地从基于web的客户端连接、读取和写入了这两个文件。但是,我将回顾我的安全规则,并将其设置为只有使用Javascript 使用web上的多个firebase实时数据库进行身份验证不起作用,javascript,firebase,firebase-realtime-database,firebase-authentication,Javascript,Firebase,Firebase Realtime Database,Firebase Authentication,我有两个Firebase实时数据库。我已经成功地从基于web的客户端连接、读取和写入了这两个文件。但是,我将回顾我的安全规则,并将其设置为只有使用 "rules": { ".read": "auth.uid != null" , ".write": "auth.uid != null" } 但是,由于某种原因,我现在无法连接到数据库,它说权限被拒绝。我在客户端使用Google进行了身份验证,其他所有使用auth的功能都如期工作。例如,我能够打印出用户的uid和所有内容
"rules": {
".read": "auth.uid != null" ,
".write": "auth.uid != null"
}
但是,由于某种原因,我现在无法连接到数据库,它说权限被拒绝。我在客户端使用Google进行了身份验证,其他所有使用auth的功能都如期工作。例如,我能够打印出用户的uid和所有内容。这是我的客户端代码(经过审查)
错误:
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>
这是已知的bug吗?我错过什么了吗?谢谢。重新加载页面时,Firebase身份验证将恢复用户的身份验证状态。这需要对服务器进行异步调用。连接侦听器时,很可能身份验证检查尚未完成 要解决此问题,请始终在以下位置附加需要身份验证的侦听器:
如果您再次遇到类似问题,我建议记录活动用户的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})
这通常会立即说明为什么安全规则拒绝您的写入。我通过从
<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>
到
从var-app=firebase.initializeApp(firebaseConfig,'app2')中删除,'app2)
代码>
这使得第二个数据库成为默认数据库,现在一切正常。但是,如果客户机上同时需要两个数据库引用,这将再次成为一个问题,据我所知,除非Firebase开发人员发布补丁,否则无法修复此问题。我仍然收到一个权限拒绝错误。我将读取请求放在authsstatechanged侦听器中,并打印出uid和用户的其余信息,确保所有信息都在那里。我还玩了一些规则,所以现在你只能在没有经过身份验证的情况下阅读,而且它是有效的。因此,由于某些原因,uid没有与读取请求一起发送。我应该在firebaseConfig中更改一些内容吗?这是非常罕见的。你认为你可以在jsbin这样的网站上设置一个复制品,这样我就可以看一看了吗?很抱歉代码太乱了。我一直在忙着修复这个错误。但代码是这样的。当我加载该小提琴时,它显示在JavaScript控制台中未定义firebase
。我们的想法是,您可以在我可以查看的网站上重现权限被拒绝的问题,这是帮助您解决看似异常情况的最快方法。通过创建第二个数据库并在相同安全规则下尝试读取,可以轻松重现此问题。我不允许分享关于数据库的任何信息,包括泄露已填充的firebaseConfig JSON。我设法解决了我自己的问题,我已经在上面发布了,但如果可能的话(因为我看到你在Firebase工作),请一定调查一下。谢谢你的帮助!
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})
<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>