环境: Firebase Unity 6.6.0,统一编辑2019.2.8f1
我看到错误“此客户端没有执行此操作的权限。”为新的匿名用户谁刚刚认证。如果我等待5-30秒,然后再次与同一个用户连接,则不会出现该问题。
我的相关实时数据库安全规则
{
"rules": {
"gameSettings":{
".read": true,
".write": false
},
"userCompletedMissions": {
".write": false,
"$uid": {
".read": "$uid === auth.uid",
}
},
"userRanks": {
".write": false,
".read": "auth != null",
"english": {
".indexOn": ["rankOrderKey", "dRankOrderKey", "wRankOrderKey", "mRankOrderKey"],
},
"spanish": {
".indexOn": ["rankOrderKey", "dRankOrderKey", "wRankOrderKey", "mRankOrderKey"],
}
}
}
}我的火力基础项目是一个移动游戏。当玩家第一次用await auth.SignInAnonymouslyAsync();创建匿名await auth.SignInAnonymouslyAsync();帐户时,立即监听数据。任何需要".read": true的操作都是完美无缺的,但是使用".read": "auth != null"和".read": "$uid === auth.uid"的任何东西都会触发我的安全规则并抛出错误“这个客户端没有执行此操作的权限”。
例如:FirebaseDatabase.DefaultInstance.GetReference("userRanks/english/SOME_USER_ID").ValueChanged += SomeFunction(...);
很明显,用户是经过身份验证的,但是Firebase的安全检查器还不知道。有什么办法让我等到我真正被认证吗?
编辑:附加信息
我发现有趣的是以下步骤的日志: 1.在Mac 2上的Unity中有一个经过身份验证的Firebase用户"Semadikp6FheE1FZMqi7MnCy0Iv2“。在Firebase控制台中,我导航到了身份验证选项卡,找到了用户"Semadikp6FheE1FZMqi7MnCy0Iv2",并删除了帐户。3.下次启动统一编辑器时,所有“此客户端没有权限执行此操作”的错误都引用了已删除的用户"Semadikp6FheE1FZMqi7MnCy0Iv2“
这似乎是一个与缓存相关的bug,无论是在客户机上,还是在Firebase服务上。
进一步解释:我反复删除与我的统一编辑器设备连接的匿名帐户,试图复制错误,阻止我的队友运行游戏。每当他在Unity中运行游戏时,他就会遇到“此客户端没有权限执行此操作”的错误,这些错误在以后的尝试中无法清除。他几周前就加入了这个项目,这个项目已经有11个月的历史了。这很可能是一个无辜的问题,比如GIT结帐中的“文件丢失”。不幸的是,我没有发现任何明显的错误,问题仍然没有解决。请给我建议。
发布于 2019-11-01 19:31:39
听起来这不是一个基于这个问题的问题,但我提出的最简单的建议是确保启用了匿名身份验证:

接下来,您可以通过以下检查来检查用户当前是否已通过身份验证:
FirebaseAuth.DefaultInstance.CurrentUser != null;如果需要,还可以在CurrentUser上检查CurrentUser。我喜欢在StateChanged侦听器的处理程序中检查这一点,以获得全局“用户已在其中签名”的信号。
综上所述,由于您使用的是await,所以您总是可以这样说:
FirebaseUser user = FirebaseAuth.DefaultInstance.SignInAnonymouslyAsync();
if (user != null) {}或者在一个协同线(我最喜欢和团结一起工作时):
Task<FirebaseUser> signInTask = FirebaseAuth.DefaultInstance.SignInAnonymouslyAsync();
yield return new WaitUntil(() => signInTask.IsComplete);
FirebaseUser user = signInTask.Result;
if (user != null) {}最后,我注意到您使用的是Firebase 6.4.0而不是6.6.0 ( 当前最新)。在某个时候,如果不保留FirebaseAuth.DefaultInstance,就会出现超出范围的问题(也就是说,如果GC决定在您放弃对FirebaseAuth.DefaultInstance的任何引用后运行),那么对其他Firebase产品的调用就不会有身份验证信息。
如果可能的话,我建议您更新最新的SDK,但也尝试在标记为FirebaseAuth的脚本中保留DontDestroyOnLoad。就像这样:
public class AuthHolder: MonoBehaviour {
public FirebaseAuth Auth {get; private set;}
void Start() {
Auth = FirebaseAuth.DefaultInstance;
DontDestroyOnLoad(gameObject); // should be at the root of a scene
}
void OnDestroy() {
Auth = null; // make sure it can get cleaned up when you exit the game
}
}如果这在最新的Firebase Unity中解决了您的问题,请在GitHub问题页面上打开一个问题。
如果您还没有看到它,我确实在这段视频中详细介绍了身份验证和统一。虽然它关注的是电子邮件/密码,而不是匿名身份验证。
我希望这能帮上忙!
-帕特里克
https://stackoverflow.com/questions/58635014
复制相似问题