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

Posted

技术标签:

【中文标题】Firebase 实时数据库规则拒绝权限【英文标题】:Firebase Realtime Database Rules Denying Permission 【发布时间】: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 是否为空

但似乎没有一个工作。

我是否缺少某些步骤?

我已经梳理了许多类似的 *** 问题和 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()
            
        )
    

【问题讨论】:

【参考方案1】:

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

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

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

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

Adding Firebase Admin SDK Verifying ID Tokens Medium Article Explaining Everything

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

【讨论】:

【参考方案2】:

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

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


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

【讨论】:

正如我在问题中所说,我已经尝试过了,但它仍然没有用。 I have tried different variations of the rules: Without the users key

以上是关于Firebase 实时数据库规则拒绝权限的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 实时数据库的权限被拒绝

Firebase实时数据库:DatabaseError权限被拒绝

如何在firebase实时数据库中编写规则?

Firestore 拒绝创建/推送集合的权限

成功身份验证后,Flutter Firebase 数据库权限被拒绝

Firebase 实时数据库未连接