首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >身份验证竞赛条件导致新用户跳转安全规则

身份验证竞赛条件导致新用户跳转安全规则
EN

Stack Overflow用户
提问于 2019-10-30 23:33:04
回答 1查看 299关注 0票数 1

环境: Firebase Unity 6.6.0,统一编辑2019.2.8f1

我看到错误“此客户端没有执行此操作的权限。”为新的匿名用户谁刚刚认证。如果我等待5-30秒,然后再次与同一个用户连接,则不会出现该问题。

我的相关实时数据库安全规则

代码语言:javascript
复制
{
  "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“

  1. 我的统一游戏容忍运行时错误通过重新加载游戏场景(统一编辑器游戏模式不停止)。当场景重新加载时,它再次从头开始初始化所有内容,包括Firebase调用。它在这次尝试中引用的Firebase用户是一个新的Firebase用户"UTc2NqwgYPTUFnnDCGSTLQm0yv63“。一切都很顺利。

这似乎是一个与缓存相关的bug,无论是在客户机上,还是在Firebase服务上。

进一步解释:我反复删除与我的统一编辑器设备连接的匿名帐户,试图复制错误,阻止我的队友运行游戏。每当他在Unity中运行游戏时,他就会遇到“此客户端没有权限执行此操作”的错误,这些错误在以后的尝试中无法清除。他几周前就加入了这个项目,这个项目已经有11个月的历史了。这很可能是一个无辜的问题,比如GIT结帐中的“文件丢失”。不幸的是,我没有发现任何明显的错误,问题仍然没有解决。请给我建议。

EN

回答 1

Stack Overflow用户

发布于 2019-11-01 19:31:39

听起来这不是一个基于这个问题的问题,但我提出的最简单的建议是确保启用了匿名身份验证:

接下来,您可以通过以下检查来检查用户当前是否已通过身份验证:

代码语言:javascript
复制
FirebaseAuth.DefaultInstance.CurrentUser != null;

如果需要,还可以在CurrentUser上检查CurrentUser。我喜欢在StateChanged侦听器的处理程序中检查这一点,以获得全局“用户已在其中签名”的信号。

综上所述,由于您使用的是await,所以您总是可以这样说:

代码语言:javascript
复制
FirebaseUser user = FirebaseAuth.DefaultInstance.SignInAnonymouslyAsync();
if (user != null) {}

或者在一个协同线(我最喜欢和团结一起工作时):

代码语言:javascript
复制
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。就像这样:

代码语言:javascript
复制
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问题页面上打开一个问题。

如果您还没有看到它,我确实在这段视频中详细介绍了身份验证和统一。虽然它关注的是电子邮件/密码,而不是匿名身份验证。

我希望这能帮上忙!

-帕特里克

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58635014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档