Firebase权限被拒绝


123

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

我有这段代码可以将数据发送到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未捕获(承诺)错误:PERMISSION_DENIED:权限被拒绝(…)

当我尝试查找时,它谈论的是Firebase的规则,该规则似乎是一种我还没有学过的语言(或者说这是我的头上的话)。有人可以解释导致问题的原因吗?我以为是我要它来存储电子邮件和用户显示名称,但您根本不被允许这样做,但是当我取出这些名称时,我仍然遇到同样的问题。是否可以在不设置规则的情况下避免这种错误,还是可以通过规则教我自己如何在一天之内完成写作,还是只是脱离了联盟?

谢谢你的帮助!

Answers:


250

默认情况下,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.
    // ...
  }
  // ...
});

1
谢谢-使用了不安全的修复程序,并在回答类似问题时引用了您的答案,以解决本Ember教程中过去的Firebase权限问题。但是,我们在哪里添加(安全)匿名身份验证代码?
戴夫·埃弗里特

2
天哪,一个小时。我在那里,但是值是FALSE ...我只是忽略了它。将它们更改为TRUE和bam,应用程序就像您想的那样工作...
Andy

OMG,我也是,我也无法弄清楚为什么当它们都已经设置为false时,它们在权限上却失败了(直到我读完您的评论)。嗯,新手的错误。当您向公众开放时,它们都应该是正确的(阅读)。感谢您指出自己的错误,您帮助我解决了该错误。为了记录,我将规则更改为:“ .read”:true,然后开始工作。
Contractorwolf

@Andy谢谢男人,我也是一样,看到您的评论就解决了我的问题;)
Mahmudul Hasan Sohag

86

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

在此处输入图片说明

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

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }

3
该死的UI!我花了整整一天的时间,弄清楚为什么我有不同的规则……啊……是为了“云存储”……谢谢!
阿列克谢·沃尔德科

43

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

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

这里复制。



4
  1. 打开firebase,在左侧选择数据库。
  2. 现在,在右侧,从下拉列表中选择[实时数据库],然后将规则更改为:{“ rules”:{“ .read”:true,“ .write”:true}}

有用..!!


5
这已经在另一个答案中说过了。另外,当您建议这样做时,请确保添加警告,因为这无法保存!
安德烈·库尔

4

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

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

2

另一个解决方案是,如果您已经有了方便的凭据,则实际上可以自动创建或登录用户。这是我使用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);
        });
}

这确实是不好的安全策略。
ASH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.