【问题标题】:Firebase only authenticating on some devices?Firebase 仅在某些设备上进行身份验证?
【发布时间】:2017-12-24 04:12:56
【问题描述】:

我已经在我的 Moto G5+(有效)和 Nexus 6(无效)上对此进行了测试,而我的 firebase 身份验证仅适用于其中之一:

  mAuth = FirebaseAuth.getInstance(); 

            if(mAuth.getCurrentUser() == null) { //No existing user
                mAuth.signInAnonymously().addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.v("myTag", "Cannot authenticate user" + e);
                    }
                });
            } 
            if(mAuth.getCurrentUser() != null) {
                Log.v("myTag", "Boutta take photos");

                takePhoto(this, 0);//back camera
            }else{
                Log.v("myTag", "Cannot take photos, user not authenticated");
            }

奇怪的是我只得到了日志Cannot take photos, the user not authenticated,却没有得到日志Cannot authenticate user。这意味着我可以对用户进行身份验证,但由于某种原因,它不起作用

为什么这只适用于某些设备?

【问题讨论】:

  • 模拟器上有 Nexus 6 吗?
  • @martinomburajr 不,这是真的

标签: android algorithm security firebase authentication


【解决方案1】:

假设您的用户开始时未经身份验证,一旦调用第一个 if 语句并尝试匿名登录,该匿名登录将在等待回调时异步发生。因此,在该状态下,直到回调完成,用户才会通过身份验证。然后代码跳转到您检查的第二组 if/else 语句

mAuth.getCurrentUser() != null

但身份验证的回调可能仍未返回,并且您的 mAuth.getCurrentUser() 仍然为空,因此跳转到 else 语句并记录 Log.v("myTag", "Cannot take photos, user not authenticated");

您的回调可能会返回验证用户的身份,但此时为时已晚。假设使用未经过身份验证,您已经运行了逻辑。

【讨论】:

  • 你说的太对了!非常感谢,我真的很感激! +1
  • 没问题,我一直在做那个异步问题。此外,我建议您使用不同的回调,即 onComplete、onSuccess 等,然后适当地分支我的代码
【解决方案2】:

@martinomburajr 让我找到了正确答案!只是为了详细说明他的解决方案,以防以后有人遇到同样的问题,我需要等到认证成功:

           mAuth = FirebaseAuth.getInstance();

                if(mAuth.getCurrentUser() == null) { //No existing user
                    Log.v("myTag", "Boutta authenticate");
                    mAuth.signInAnonymously().addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                        }
                    }).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if(mAuth.getCurrentUser() != null) {

//TAKE PHOTO HERE INSTEAD
                    takePhoto(c, 0);//back camera


                            }else{
                                Log.v("myTag", "Cannot take photos, user not authenticated");
                            }
                        }
                    });
                }else {
                    Log.v("myTag", "aalready authenticated!");

                    takePhoto(c, 0);//back camera
                    frontOrBack = 0;
                }


            }

当我输入我的身份验证相关代码(在本例中是为了拍照)时,我没有给我的应用足够的时间来获得 Firebase 的响应。然而,我不只是假设用户已通过身份验证,而是通过将身份验证相关代码放入 OnCompleteListener 来解决此问题。非常感谢@martinomburajr 的有用回答!

【讨论】:

    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多