Firebase 权限被拒绝

IT技术 javascript firebase firebase-realtime-database firebase-security
2021-01-16 00:03:51

我对编码比较陌生,遇到了麻烦。

我有这个代码可以将数据发送到 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 的规则,它似乎是一种我还没有学过的语言(或者它只是让我无法理解)。有人可以解释导致问题的原因吗?我以为是我要求它存储电子邮件和用户显示名称,而您不允许这样做,但是当我将它们取出时,我仍然遇到同样的问题。有没有办法在不设置规则的情况下避免这个错误,或者规则是我可以在一天内教自己如何写的东西,或者我只是脱离了我的联盟?

谢谢你的帮助!

6个回答

默认情况下,Firebase 控制台中项目中的数据库只能由管理用户读取/写入(例如在 Cloud Functions 或使用 Admin SDK 的进程中)。除非您更改服务器端安全规则,否则常规客户端 SDK 的用户无法访问数据库。


您可以更改规则,以便只有经过身份验证的用户才能读取/写入数据库:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

请参阅Firebase 数据库安全规则快速入门

但由于您没有通过代码登录用户,因此数据库拒绝您访问数据。为了解决这个问题,您需要允许未经身份验证的数据库访问,或者在访问数据库之前登录用户。

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

目前最简单的解决方法(直到教程更新)是进入您项目的控制台中的“数据库”面板,选择“规则”选项卡并将内容替换为以下规则:

{
  "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.
    // ...
  }
  // ...
});
天哪,还有一个小时。我在那里有这个,但值是错误的......我只是忽略了它。将它们更改为 TRUE 和 bam,应用程序就像你想象的那样工作......
2021-03-21 00:03:51
@Andy 谢谢你,对我来说也是一样,看到你的评论刚刚解决了我的问题;)
2021-03-24 00:03:51
我的天啊,我也是,无法弄清楚为什么他们都已经设置为 false 时权限失败(直到我阅读了您的评论)。呃,菜鸟错误。当你向公众开放时,它们都应该是真的(阅读)。感谢您指出您自己的错误,您帮我弄清楚了。为了记录,我将规则更改为:“.read”:true,然后它开始工作。
2021-03-27 00:03:51
谢谢 -在这个Ember 教程中使用了不安全的修复程序并在对类似问题的回复中引用了您的答案,以解决Firebase 权限问题但是我们在哪里添加(安全的)匿名身份验证代码?
2021-04-11 00:03:51

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

在此处输入图片说明

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

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }
该死的用户界面!我花了一整天,弄清楚为什么我有不同的规则......啊......它是为了“云firestore”......谢谢!
2021-03-15 00:03:51

转到您提到的“数据库”选项。

  1. 在蓝色标题上,您会找到一个下拉菜单,上面写着 Cloud Firestore Beta
  2. 将其更改为“实时数据库”
  3. 转到规则并将 .write .read 都设置为 true

这里复制

我拒绝了这一点,因为我认为这是一个糟糕的建议。如果新手询问如何打开他们商店的前门,您不能只建议他们完全取下锁。禁用安全规则可能会导致灾难,如果用户数据泄露(并且很可能会泄露),可能会导致非常昂贵的罚款。
2021-04-01 00:03:51
一个在这里呆了几天的菜鸟会认为我的回答很有帮助。我知道当我现在解决这个问题时我有多高兴我正在帮助人们而你却在投票@silviot 一个菜鸟只是在制作中一无所获
2021-04-03 00:03:51
我明白你的观点,我完全同意这种精神。问题是,您没有在答案中说明这一点。如果你包含一个警告的话,我会完全同意。但是您只提到了删除安全检查所需的步骤,而没有警告可能出现的意外后果。
2021-04-05 00:03:51

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

Cloud Firestore,实时数据库

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

将规则更改为 true。

我拒绝了这一点,因为我认为这是一个糟糕的建议。如果新手询问如何打开他们商店的前门,您不能只建议他们完全取下锁。禁用安全规则可能会导致灾难,如果用户数据泄露(并且很可能会泄露),可能会导致非常昂贵的罚款。此外,它是@ahmed-adewale 答案的重复。
2021-04-10 00:03:51

好的,但是您不想打开整个实时数据库!你需要这样的东西。

{
  /* 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"
      }
    }
  }
}