【问题标题】:Firebase Realtime Database Rules Denying PermissionFirebase 实时数据库规则拒绝权限
【发布时间】:2020-12-29 06:55:48
【问题描述】:

我有一个使用 Kotlin 构建的应用程序,后端使用 Node.js。 我允许用户在客户端应用程序上使用 Firebase 身份验证登录/注册。

该应用程序的部分功能是让用户通过 Firebase 的实时数据库在线保存数据。应用程序内部发生的情况是,一旦用户登录,我将他/她的 uid 传递给后端,后端向数据库发出请求。

当数据库的规则是允许所有人读/写时,一切正常。 一旦我将它们更改为:

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

}

我不断收到 Permission Denied。

我尝试了不同的规则变体:

  • 没有用户密钥
  • 仅检查 auth 是否为空

但似乎没有一个工作。

我是否缺少某些步骤?

我已经梳理了许多类似的 StackOverflow 问题和 Firebase 的实时数据库文档,但没有找到我的问题的答案。

一些代码供参考:

后端:

app.get('/someRoute', function (req, res) {
var database = firebase.database()
var uid = req.query.uid

database.ref('/users/' + uid).once('value')
.then(function(snapshot) {
  var data = snapshot.val() ? snapshot.val() : []
  res.status(200).send({ response: data})
}).catch(function(error) {
  console.log(error)
  res.status(500).json({ error: error})
  })
})

客户:

fun loginUser(view : View) {
    FirebaseAuth.getInstance().signInWithEmailAndPassword(userEmail, userPassword)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                updateFirebaseUserDisplayName()
            } else {
                Toast.makeText(this, "An error has occurred during login. Please try again later.", Toast.LENGTH_SHORT).show()
            }
        }
}

fun updateFirebaseUserDisplayName() {

    FirebaseAuth.getInstance().currentUser?.apply {
        val profileUpdates : UserProfileChangeRequest = UserProfileChangeRequest.Builder().setDisplayName(userEmail).build()
        updateProfile(profileUpdates)?.addOnCompleteListener(OnCompleteListener {
            when(it.isSuccessful) {
                true -> apply {
                    Intent(this@LoginActivity, MainActivity::class.java).apply {
                        startActivity(this)
                        finish()
                    }
                }
                false -> Toast.makeText(this@LoginActivity, "Login has failed", Toast.LENGTH_SHORT).show()
            }
        })
    }
}

【问题讨论】:

    标签: node.js kotlin firebase-realtime-database firebase-authentication


    【解决方案1】:

    经过一番搜索,我找到了解决问题的方法。

    似乎因为我在客户端上对用户进行身份验证,并且有一个与 Firebase 的实时数据库通信的后端,所以我不得不在后端使用 Firebase 的 Admin SDK

    这是因为每次用户登录并在客户端进行身份验证时都需要传递一个唯一的令牌。然后需要将此令牌发送到后端并在尝试访问实时数据库时使用。

    对于任何偶然发现这个问题并想知道如何完成的人,请点击以下链接:

    另外,请确保正确引用您的数据库名称

    【讨论】:

      【解决方案2】:

      您授予节点的权限似乎有问题,即users,然后尝试以下方式

      只有经过身份验证的用户才能访问/写入数据

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

      【讨论】:

      • 正如我在问题中所说,我已经尝试过了,但它仍然没有用。 I have tried different variations of the rules: Without the users key
      猜你喜欢
      • 2020-10-16
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2020-08-16
      • 1970-01-01
      • 2020-11-25
      • 2018-12-12
      相关资源
      最近更新 更多