Firebase 权限被拒绝

Firebase Permission Denied

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

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

感谢您的帮助!

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


您可以更改规则,使数据库仅 readable/writeable 由经过身份验证的用户访问:

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

参见quickstart for the Firebase Database security rules

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

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

目前最简单的解决方法(在教程更新之前)是进入项目控制台的数据库面板,select 规则选项卡并用这些规则替换内容:

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

这使您的新数据库对任何了解该数据库 URL 的人都可读可写。 确保在投入生产之前再次保护您的数据库,否则可能有人会开始滥用它。

访问数据库前先登录用户

对于(稍微)更耗时但更安全的解决方案,请调用 Firebase Authentication to ensure the user is signed in before accessing the database. The simplest way to do this is using anonymous authenticationsignIn... 方法之一:

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. 打开 firebase,select 数据库在左侧。
  2. 现在在右手边,select [实时数据库] 淹没并将规则更改为:
{
  "rules": {
    ".read": true,
    ".write": true
  }
}

转到您提到的 "Database" 选项。

  1. 在蓝色 Header 上,您会找到一个下拉菜单,其中显示 Cloud Firestore Beta
  2. 改为"Realtime database"
  3. 转到规则并将 .write .read 都设置为 true

复制自 here

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

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

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

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

Cloud Firestore,实时数据库

Select实时数据库并进入规则

将规则更改为 true。

另一种解决方案是,如果您手边已有凭据,则可以自动创建或登录用户。这是我使用 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);
        });
}

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

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

如果您试图在 firebase 中重用旧项目,由于免费帐户限制,那么您的数据库规则可能已过时。

在我的例子中,我遇到了错误 401 Unauthorized,当我将读写规则都设置为 true 时它就解决了。

感谢这个伟大的社区!

来自巴西的尊重!

如果提供的 Firebase 项目 ID 不正确,也会出现 PermissionDenied。

请参阅 this guide 检查您的项目 ID:

Firebase console: Click settings Project settings. The project ID is displayed in the top pane.

我也遇到了同样的问题。确保您使用的是 real-time 数据库而不是云。然后更改规则以允许所有用户访问,如下所示

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

默认情况下,firestore 数据库只允许管理员读取和写入数据库,因此 read/write 规则将设置为 false。