为什么我的Firebase实时数据库规则会破坏我的HandleValue?

为什么我的Firebase实时数据库规则会破坏我的HandleValue?,firebase,unity3d,firebase-realtime-database,firebase-security,Firebase,Unity3d,Firebase Realtime Database,Firebase Security,早上好 我正在我的Unity游戏中处理一个Firebase项目,并且正在保护数据库中的数据,但是每当我更新规则时,它就会破坏我的handlevaluechanged函数(否则正在工作) 数据结构如下所示: 用户列表-> Firebase\u用户\u ID-> 健康:100, 姓名:傅,, 等等 我希望此数据的规则(至少,我稍后将添加验证)为: "USER_LIST": { "$UID" : { ".read": "auth.uid === $UID",

早上好

我正在我的Unity游戏中处理一个Firebase项目,并且正在保护数据库中的数据,但是每当我更新规则时,它就会破坏我的handlevaluechanged函数(否则正在工作)

数据结构如下所示:

用户列表-> Firebase\u用户\u ID-> 健康:100, 姓名:傅,, 等等

我希望此数据的规则(至少,我稍后将添加验证)为:

"USER_LIST":
{
    "$UID" :
    {
            ".read": "auth.uid === $UID",
            ".write" : "auth.uid === $UID",
    }
},

在本地游戏中,我通过以下电话获得了一个参考:

FirebaseDatabase.DefaultInstance.GetReference("USER_LIST").Child(USER_ID).ValueChanged += HandleValueChanged;
如果我将规则设置为:

            ".read": true,
            ".write" : true
一切正常。客户端可以更新数据库,handlevaluechanged则负责保持本地数据的同步。当我切换到上面验证身份验证ID的规则时,客户端仍然工作。只要登录了正确的用户ID,它就可以无问题地更新数据库。但是,my Handlevaluechanged从firebase获得一个权限拒绝错误,就好像Handlevaluechanged侦听器在尝试从DB读取时没有提供正确的用户ID一样

我很困惑,因为规则允许我首先获取引用,然后从客户机更新数据库,但我不能从数据库更新客户机?我错过了什么

我还尝试在USER_LIST节点而不是USER_ID节点获取引用,结果相同


如有任何见解,将不胜感激!先谢谢你

在忽略了这个问题一段时间并处理了其他bug之后,我发现了真正的问题,并想发表文章,以防其他人发现自己陷入了这个困境

我有一个专门用于登录用户的Unity场景,这些用户创建了经过身份验证的Firebase用户,然后跳转到一个新场景。在这个新场景中,我搜索用户登录时创建的本地用户对象,然后设置数据库引用和handleValueChanged侦听器

我认为问题在于搜索用户是异步进行的(我没有做更多的研究来证实这一点,但我在这个特定案例中的测试似乎表明情况就是如此),因此任务开始了,在它查找用户凭据的同时,它创建了DB引用并添加了一个具有空用户的侦听器。之后,任务完成,用户不再为null,但侦听器已经在侦听

然后,如果我进行了数据库读或写操作,则读或写的调用来自经过身份验证的用户,只要满足RTB规则,就会执行。成功的写操作将触发handlevaluechanged侦听器,并由于侦听器没有与之关联的经过身份验证的用户ID而导致权限拒绝错误(同样,我是基于对这个特定项目的观察和测试得出这个结论的,而不是研究)

创建本地用户对象后,只需将DB引用添加到该对象,而不是搜索用户,然后建立引用,即可解决所有问题


我希望这有帮助

您是否确保上述附件是在
AuthStateChanged
事件处理程序中创建的?您需要确保在用户状态更新时连接和断开处理程序。如果与其他SDK一样,当前用户将被视为“挂起”(几乎被视为
null
),直到用户的身份验证状态得到确认。在这个短窗口中,上述规则将抛出权限错误。@samthecodingman感谢您的回复!我没有考虑过这个。理论上,一旦用户签署了它,它应该保持这种方式,对吗?我看到的行为是,一旦用户登录,获取引用并启动侦听器。我可以很好地上传和下载数据,但侦听器被我的规则拒绝。您是建议用户在我不知道的情况下注销,还是在用户成功登录之前激活了侦听器?再次感谢!当您的客户端尝试在没有权限的情况下下载数据时,侦听器将被拒绝访问—原因可能是当前访问令牌已过期、用户已注销或访问令牌已无效(例如,用户已删除)。用户不一定是注销的,但在Firebase Auth初始化时,用户的访问令牌通常需要验证和刷新-在这个过程中,您的侦听器将失败。协商完成后,
AuthStateChanged
事件处理程序将启动,表明auth已准备好使用,但用于Firebase身份验证服务。您始终可以在数据库模拟器中测试规则(单击
数据
旁边的
规则
选项卡)。在本文中,我对云存储稍微做了一些探讨,但对于实时数据库,其功能基本相同:。您还可以断言
FirebaseAuth.DefaultInstance.CurrentUser!=如果您希望快速进行模糊测试以确定这是否是您的问题,则为null。