我对编码比较新,而且遇到了麻烦。
我有这个代码将数据发送到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警告:设置为/ users /(GoogleID)失败:permission_denied 2016-05-23 22:52:42.707 firebase.js:227 Uncaught(in promise)错误:PERMISSION_DENIED:权限被拒绝(...)
当我试着查看它时,它讨论了Firebase的规则,这似乎是我还没有学到的语言(或者它只是在我脑海中)。有人可以解释导致问题的原因吗?我以为是我要求它存储电子邮件和用户显示名称而你只是不允许这样做,但当我拿出它时我仍然遇到同样的问题。有没有办法在没有设定规则的情况下避免这个错误,或者规则是我可以教会自己如何在一天内写作,或者我是否只是离开了我的联盟?
感谢您的帮助!
答案 0 :(得分:198)
默认情况下,new Firebase Console中项目中的数据库只能由经过身份验证的用户读取/写入:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
请参阅quickstart for the Firebase Database security rules。
由于您未从代码中签入用户,因此数据库拒绝您访问数据。要解决此问题,您需要允许对数据库进行未经身份验证的访问,或者在访问数据库之前登录用户。
目前最简单的解决方法(在教程更新之前)是进入项目控制台的“数据库”面板,选择“规则”选项卡并使用这些规则替换内容:
{
"rules": {
".read": true,
".write": true
}
}
这使得您的新数据库可供任何知道数据库URL的人阅读和编写。确保在投入生产之前再次保护您的数据库,否则有人可能会开始滥用它。
对于(稍微)更耗时但更安全的解决方案,请调用Firebase Authentication的signIn...
方法之一,以确保用户在访问数据库之前已登录。最简单的方法是using anonymous authentication:
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.
// ...
}
// ...
});
答案 1 :(得分:45)
我遇到了类似的问题,发现此错误是由于为实时数据库的读/写操作设置的规则不正确造成的。默认情况下,Google Firebase现在会加载云存储而不是实时数据库。我们需要切换到实时并应用正确的规则。
我们可以看到它说云Firestore不是实时数据库,一旦切换到正确的数据库,请遵循以下规则:
{
"rules": {
".read": true,
".write": true
}
}
答案 2 :(得分:25)
WORKING!!
Go to the "Database" option you mentioned.
1. There on the Blue Header you'll find a dropdown which says Cloud Firestore Beta
2. Change it to "Realtime database"
3. Go to Rules and set .write .read both to true
Let me know how it goes.
copied from
https://github.com/firebase/quickstart-js/issues/239
答案 3 :(得分:5)
转到数据库,标题旁边有2个选项:
Cloud Firestore,实时数据库
选择实时数据库并转到规则
将规则更改为true。
这解决了我的问题。
答案 4 :(得分:2)
有效.. !!
答案 5 :(得分:1)
另一种解决方案是,如果您已经有了方便的凭据,则实际上可以自动创建或登录用户。这是我使用Plain JS的方法。
function loginToFirebase(callback)
{
let email = 'xx@xx.com';
let password = 'xxxxxxxxxxxxxx';
let config =
{
apiKey: "xxx",
authDomain: "xxxxx.firebaseapp.com",
projectId: "xxx-xxx",
databaseURL: "https://xxx-xxx.firebaseio.com",
storageBucket: "gs://xx-xx.appspot.com",
};
if (!firebase.apps.length)
{
firebase.initializeApp(config);
}
let database = firebase.database();
let storage = firebase.storage();
loginFirebaseUser(email, password, callback);
}
function loginFirebaseUser(email, password, callback)
{
console.log('Logging in Firebase User');
firebase.auth().signInWithEmailAndPassword(email, password)
.then(function ()
{
if (callback)
{
callback();
}
})
.catch(function(login_error)
{
let loginErrorCode = login_error.code;
let loginErrorMessage = login_error.message;
console.log(loginErrorCode);
console.log(loginErrorMessage);
if (loginErrorCode === 'auth/user-not-found')
{
createFirebaseUser(email, password, callback)
}
});
}
function createFirebaseUser(email, password, callback)
{
console.log('Creating Firebase User');
firebase.auth().createUserWithEmailAndPassword(email, password)
.then(function ()
{
if (callback)
{
callback();
}
})
.catch(function(create_error)
{
let createErrorCode = create_error.code;
let createErrorMessage = create_error.message;
console.log(createErrorCode);
console.log(createErrorMessage);
});
}
答案 6 :(得分:0)
好的,但是您不想打开整个实时数据库! 您需要像这样的东西。
{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": "auth.uid !=null",
".write": "auth.uid !=null"
}
}
或
{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}