Firebase 权限被拒绝
Firebase 权限被拒绝
我对编码还比较陌生,遇到了麻烦。
我有这个代码来向firebase发送数据
app.userid = app.user.uid var userRef = app.dataInfo.child(app.users); var useridRef = userRef.child(app.userid); useridRef.set({ locations: "", theme: "", colorScheme: "", food: "" });
但是,我一直收到这个错误:
FIREBASE WARNING: set at /users/(GoogleID) failed: permission_denied
2016-05-23 22:52:42.707 firebase.js:227 Uncaught (in promise) Error: PERMISSION_DENIED: Permission denied(…)
当我试图查找这个错误时,它谈到Firebase的规则,这似乎是一种我还没学过的语言(或者只是过了我的头)。有人可以解释一下问题的原因吗?我以为是因为我要求它存储电子邮件和用户显示名称而你不能这样做,但是当我把它们拿出来时,我仍然有同样的问题。是否有一种避免此错误而不设置规则的方法,或者规则是我可以在一天内学会如何编写的东西,或者我完全不了解?
感谢任何帮助!
我面临着类似的问题,并发现这个错误是由于实时数据库的读写操作设置不正确引起的。默认情况下,Google Firebase现在加载的是云存储而不是实时数据库。我们需要切换到实时数据库并应用正确的规则。
正如我们所看到的,它说的是云Firestore而不是实时数据库,一旦切换到正确的数据库就应用以下规则:
{ "rules": { ".read": true, ".write": true } }
注意:
规则一定要小心。将读写设置为true
会使数据库面临祈祷的眼睛。
了解更多:
默认情况下,在Firebase控制台中的项目中的数据库只有管理用户(例如在Cloud Functions或使用Admin SDK的进程中)可以读取/写入。常规客户端SDK的用户无法访问数据库,除非更改服务器端安全规则。
您可以更改规则,使数据库仅限身份验证用户可读/写:
{ "rules": { ".read": "auth != null", ".write": "auth != null" } }
但由于您没有从代码中登录用户,因此数据库拒绝访问数据。为了解决这个问题,您需要允许未经身份验证的访问您的数据库,或在访问数据库之前登录用户。
允许未经身份验证的访问您的数据库
目前,最简单的解决方法(直到教程更新为止)是进入控制台中项目的数据库面板,选择规则选项卡,并将其内容替换为以下规则:
{ "rules": { ".read": true, ".write": true } }
这使得您的新数据库可以被任何知道数据库URL的人读取和写入。 请确保在发布前重新保护您的数据库,否则某些人很可能会开始滥用它。
在访问数据库之前登录用户
要使用稍微费时但更安全的解决方案之一,在访问数据库之前调用Firebase身份验证的signIn...
方法之一以确保用户已登录。使用匿名身份验证是最简单的方法:
firebase.auth().signInAnonymously().catch(function(error) { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // ... });
接着在检测到登录时附上你的监听器
firebase.auth().onAuthStateChanged(function(user) { if (user) { // User is signed in. var isAnonymous = user.isAnonymous; var uid = user.uid; var userRef = app.dataInfo.child(app.users); var useridRef = userRef.child(app.userid); useridRef.set({ locations: "", theme: "", colorScheme: "", food: "" }); } else { // User is signed out. // ... } // ... });