Firebase权限被拒绝

Rob*_*ine 105 javascript firebase firebase-security firebase-realtime-database

我对编码比较新,遇到了麻烦.

我有这个代码将数据发送到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: ""
});
Run Code Online (Sandbox Code Playgroud)

但是,我一直收到错误:

FIREBASE警告:设置为/ users /(GoogleID)失败:permission_denied 2016-05-23 22:52:42.707 firebase.js:227未捕获(承诺)错误:PERMISSION_DENIED:权限被拒绝(...)

当我试着查看它时,它会讨论Firebase的规则,它似乎是一种我还没有学过的语言(或者它只是在我脑海中).有人可以解释导致问题的原因吗?我以为是我要求它存储电子邮件和用户显示名称而你只是不允许这样做,但当我把它拿出来时我仍然遇到同样的问题.有没有办法在没有设定规则的情况下避免这种错误,或者规则是我可以教自己如何在一天内写作,或者我是否只是走出了我的联盟?

谢谢你的帮助!

Fra*_*len 225

默认情况下,新Firebase控制台中项目中的数据库只能由经过身份验证的用户读取/写入:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
Run Code Online (Sandbox Code Playgroud)

请参阅快速入门以了解Firebase数据库安全规则.

由于您未从代码中签入用户,因此数据库拒绝您访问数据.要解决这个问题,您需要允许对数据库进行未经身份验证的访问,或者在访问数据库之前登录用户.

允许未经身份验证的数据库访问权限

目前最简单的解决方法(直到教程更新)是进入项目控制台的Database面板,选择Rules选项卡并用以下规则替换内容:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}
Run Code Online (Sandbox Code Playgroud)

这使得您的新数据库可由任何知道数据库URL的人读取和写入.在投入生产之前,请务必再次保护您的数据库,否则有人可能会开始滥用它.

在访问数据库之前登录用户

对于(稍微)更耗时但更安全的解决方案,请调用Firebase身份验证signIn...方法之一以确保用户在访问数据库之前已登录.最简单的方法是使用匿名身份验证:

firebase.auth().signInAnonymously().catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});
Run Code Online (Sandbox Code Playgroud)

然后在检测到登录时附加您的听众

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.
    // ...
  }
  // ...
});
Run Code Online (Sandbox Code Playgroud)

  • 天哪,还有一个小时。我在那里有这个,但值是错误的......我只是忽略了它。将它们更改为 TRUE 和 bam,应用程序就像你想象的那样工作...... (2认同)

jus*_*ird 64

我遇到了类似的问题,发现这个错误是由于为实时数据库设置了不正确的读/写操作规则.默认情况下,google firebase现在加载云存储而不是实时数据库.我们需要切换到实时并应用正确的规则.

在此输入图像描述

我们可以看到它说云Firestore不是实时数据库,一旦切换到正确的数据库应用以下规则:

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }
Run Code Online (Sandbox Code Playgroud)

  • 该死的UI!我花了整整一天的时间,弄清楚为什么我有不同的规则……啊……是为了“云存储”……谢谢! (2认同)

lil*_*mad 34

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
Run Code Online (Sandbox Code Playgroud)

  • 我否决了这个建议,因为我认为这是一个糟糕的建议。如果一个新手问如何打开他们商店的前门,你不能只是建议他们完全拆掉锁。禁用安全规则可能会导致灾难,如果用户数据泄露(很可能会发生),还可能导致非常昂贵的罚款。 (2认同)
  • 我明白你的观点,我完全同意你的精神。问题是,您没有在答案中具体说明这一点。如果你提一句警告的话,我会完全同意。但您只提到了删除安全检查所需的步骤,而没有警告可能出现的意外后果。 (2认同)

小智 9

转到数据库,标题旁边有2个选项:

Cloud Firestore,实时数据库

选择实时数据库并转到规则

将规则更改为true.

这解决了我的问题.

  • 我否决了这个建议,因为我认为这是一个糟糕的建议。如果一个新手问如何打开他们商店的前门,你不能只是建议他们完全拆掉锁。禁用安全规则可能会导致灾难,如果用户数据泄露(很可能会发生),还可能导致非常昂贵的罚款。另外,它与 @ahmed-adewale 的答案重复。 (3认同)