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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Firebase仅在某些设备上进行身份验证?相关的知识,希望对你有一定的参考价值。

我已在我的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。这意味着我能够对用户进行身份验证,但由于某种原因,它不起作用

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

答案

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

mAuth.getCurrentUser() != null

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

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

另一答案

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

以上是关于Firebase仅在某些设备上进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 电话身份验证 (Flutter) 在某些 iOS 设备中不起作用

iOS SDK 在测试设备上进行身份验证时报告“用户被拒绝”

iOS Facebook SDK 在设备上进行身份验证后未重定向

使用 WebAuthN 可以拒绝某些类型的身份验证方法 FIDO2)

在 C# Web api 上进行用户身份验证的最佳实践是啥?

Expo + Firebase 身份验证(注册)安全问题