Firebase仅在某些设备上进行身份验证?

时间:2017-12-24 04:12:57

标签: android algorithm security firebase authentication

我已经在我的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。这意味着我可以对用户进行身份验证,但由于某种原因,它无法正常工作

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

2 个答案:

答案 0 :(得分:2)

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

mAuth.getCurrentUser() != null

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

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

答案 1 :(得分:0)

@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的有益答案!