Firebase实时数据库规则拒绝权限

时间:2020-09-10 18:09:02

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

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

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

当数据库规则允许所有人读写时,一切工作都很好。 一旦我将其更改为此:

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

}

我一直被拒绝访问。

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

  • 没有用户密钥
  • 仅检查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()
            }
        })
    }
}

2 个答案:

答案 0 :(得分:2)

您授予节点的权限似乎存在问题,即users并尝试以下方式

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

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

答案 1 :(得分:2)

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

看来,由于我正在对客户端上的用户进行身份验证,并且后端与Firebase的实时数据库进行通信,因此我不得不在后端使用 Firebase的管理SDK

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

对于其他偶然发现此问题并想知道如何解决的人,请点击以下链接:

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