在auth.uid不起作用的情况下限制对Firebase-Database的访问

时间:2018-09-22 13:15:39

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

我想限制对Firebase数据库的访问,以便只有我授权的用户才能对其进行写入。 但是几乎所有提议的解决方案似乎都不适合我。

我的控制台中总是出现401(未经授权)错误。

我尝试了两种检查正确用户是否登录的方法,但是没有一种对我有用。

1。规则中硬编码的uid:

{
"rules": {
  ".read": true,
  ".write": "auth.uid === 'UID'")",
    }
}

2。数据库中的uid

{
"rules": {
  ".read": true,
  ".write": "root.child('users').hasChild(auth.uid)",
    }
}

在两种方式中,我都使用了Firebase-Authentication概述中提供的uid。 我使用Google作为登录提供程序。

2 个答案:

答案 0 :(得分:1)

来自the documentation

  

这是一个规则的示例,该规则授予已验证的写访问权限   /users/<uid>/的用户,其中<uid> 是获得的用户ID   通过Firebase身份验证。


修改:

对于通过Firebase身份验证的特定路径和当前获得的用户,这应该有所帮助:

{
  "rules": {
    "YourSpecificPath": {

     "$uid": { // where <uid> is the ID of the user obtained through Firebase Authentication
        ".write": "$uid === auth.uid"    
        ".read": true,

      }
    }
  }
}

或者直接给uid

{
  "rules": {
    ".read": true,
    ".write": "auth.uid === 'dJrGShfgfd2'"
  }
}

答案 1 :(得分:1)

所有代码示例都是正确的

Mohsen的问题和答案中的所有代码片段 工作。 我只是忘了随同我的补丁请求一起发送idToken。

获取idToken的代码:

firebase.auth().currentUser.getIdToken(/* forceRefresh */ true).then(function(idToken) {
  // Send token to your backend via HTTPS
  // ...
}).catch(function(error) {
  // Handle error
});

来自:https://firebase.google.com/docs/auth/admin/verify-id-tokens#retrieve_id_tokens_on_clients

使用idToken进行身份验证:

https://<DATABASE_NAME>.firebaseio.com/users/ada/name.json?auth=<ID_TOKEN>

来自:https://firebase.google.com/docs/database/rest/auth