当我被“拒绝”时,如何让Firebase安全规则允许对我的实时数据库的身份验证访问

时间:2020-07-26 07:48:33

标签: firebase firebase-realtime-database firebase-authentication firebase-security

我发现了这个问题:Firebase Permission Denied,其中提到使用此JSON代码:

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

它仅允许经过身份验证的用户访问读取或写入。这对我来说非常合适。

唯一的问题是此答案已过时。据我所知,他们不再使用JSON。

当前我的规则如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

如何像我以前的问题一样,仅允许使用我已提供并加载到应用中的“ API密钥”对用户进行读写访问?

编辑,我现在知道Firebase Realtime数据库使用JSON规则,而Firebase Firestore使用实际的Firebase安全规则语言。

因此,在意识到这一点之后,我将所有规则都设置为auth!= null。

实时数据库规则:

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

还有云存储规则,以防万一:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

尽管如此,我仍然遇到以下错误:enter image description here

我没有发现我做错了什么,我直接正确发送了API密钥,我只是为了测试对其进行了记录,我所有的引用都是正确的...

我不明白。...

编辑:代码

const firebase = require('firebase');
var config = {
    apiKey: "(Key removed... for obvious reasons)",
    authDomain: "discord-trust.firebaseapp.com",
    databaseURL: "https://discord-trust.firebaseio.com",
    storageBucket: "discord-trust.appspot.com"
};
firebase.initializeApp(config);

... Lots of code between these two ...

case `testWriteReputation`: {
                    if (msg.author.bot) return;
                    if (msg.author.id === bot.user.id) return;
                    firebase.database().ref(`BasicUserData/${msg.author.id}`).set({
                        lastLoggedUsername: msg.author.tag,
                        lastLoggedAvatar: msg.author.avatar,
                        lastLoggedDiscriminator: msg.author.discriminator,
                        userAccountCreated: msg.author.createdAt,
                        userIdentifier: msg.author.id
                    });
                    break;
                }

再次在此处找到完整的javascript文件,并且删除了api键:https://hatebin.com/egchvudbew

1 个答案:

答案 0 :(得分:1)

doc中所述,如果要在实时数据库安全性规则中使用auth变量(允许您按每个用户控制数据访问),则需要使用Firebase Authentication

用户进行身份验证后,您的实时数据库中的auth变量 规则规则将使用用户的信息填充。这个 信息包括其唯一标识符(uid)以及链接的 帐户数据,例如Facebook ID或电子邮件地址,以及其他 信息。

有关此doc的更多信息,请参见如何开始使用身份验证。


请注意,实时数据库和Firestore是两个完全不同的Firebase服务。它们不具有相同的安全规则语法。