当前位置: 首页 > 知识库问答 >
问题:

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

钱浩荡
2023-03-14

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

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

当数据库的规则是允许每个人读/写时,一切都正常工作。一旦我把它们改成这样:

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

}

我一直被拒绝许可。

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

  • 没有用户密钥
  • 只检查auth不是null

但似乎都不管用。

我是不是漏了什么步骤?

我已经梳理了许多类似的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个答案

百里泓
2023-03-14

您对节点(即用户的权限)的权限似乎有问题,请尝试下面的方法

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

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
秦才英
2023-03-14

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

似乎是因为我在客户端上对用户进行身份验证,并且后端与Firebase的实时数据库通信,所以我必须在后端使用Firebase的管理员SDK。

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

如果其他人偶然发现这个问题,并想知道如何解决,请点击以下链接:

  • 添加Firebase管理员SDK
  • 验证ID令牌
  • 解释一切的媒体文章

另外请确保正确引用您的库名

 类似资料:
  • 我正试图按照Firebase的在线指南使用Firebase实时数据库,但由于我的许可被拒绝,我无法获得数据库的任何更新。我不确定我做错了什么。我甚至设定了阅读和写作的规则。 onClickListener内的代码如下: 这是在片段中,按钮在开始片段替换事务之前首先完成这些语句。 以下是Firebase中的规则: 由于我不熟悉JSON,我也尝试过在“.write”结尾加逗号 这是stacktrace

  • 我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询:

  • 我使用以下规则检查只有“管理员”才能写入陷阱部分。 这个很好用。但是如果我把规则改为, 然后我得到了一个权限错误。W/SyncTree:侦听/traps失败:数据库错误:权限被拒绝。 我之所以改变结构,是因为我试图使用validate函数,但由于我无法通过第一个问题,我无法达到验证的程度。 我肯定这是一个新手理解错误,但在尝试了许多排列后,我在这方面进展甚微。您的协助将不胜感激。 更新201606

  • 我一直在尝试使用数据库规则和通过CLI托管来创建一个基本上是公共的数据库,但有一些限制。如果我根据规则声明数据库已打开,我可以访问该数据库,但如果我从顶层删除读/写操作并尝试仅访问一个子“规则”,我会遇到权限错误: [2018-10-04T16:13:56.926Z]@firebase/database:firebase警告:设置为/2019/statistics/topTens/Strider

  • 我有一个数据库: 当用户()在应用程序中注册时,他会填充另一个用户uid(该用户uid具有属性)并将自己的uid添加到他的个人资料中(

  • 如果我在公共模式下使用Firebase实时数据库发布我的Android应用程序会怎么样,因为我不需要任何身份验证。它说 公共访问使您的数据库对任何人开放,即使是不使用您的应用的人,因此请务必在设置身份验证时再次限制您的数据库。 我不清楚,如果他们的应用程序没有连接到我的数据库,而且他们也没有firebase帐户的登录密码,那么他们怎么能访问我的数据库。 提前发送Thx