如何从 Firebase Task<AuthResult> 登录失败中检索错误代码?

Posted

技术标签:

【中文标题】如何从 Firebase Task<AuthResult> 登录失败中检索错误代码?【英文标题】:How do you retrieve the error code from a Firebase Task<AuthResult> unsuccessful login? 【发布时间】:2016-10-21 14:00:33 【问题描述】:

我目前想知道在使用Firebase 登录失败后如何获得错误代码。从他们的遗留代码中,您可以在下面的链接中看到:

https://www.firebase.com/docs/android/guide/user-auth.html#section-handling-errors

@Override
public void onAuthenticationError(FirebaseError error) 
    switch (error.getCode()) 
        case FirebaseError.USER_DOES_NOT_EXIST:
            // handle a non existing user
            break;
        case FirebaseError.INVALID_PASSWORD:
            // handle an invalid password
            break;
        default:
            // handle other errors
            break;
    

您将获得一个onAuthenticationError,然后可以专门分析FirebaseError 以向用户产生不同的反馈错误。然而,由于他们最近发布了他们的新 API,我已经开始使用它。这是我现在必须使用的代码:

@Override
public void onComplete(@NonNull Task<AuthResult> task) 
    //If authentication fails
    if (!task.isSuccessful()) 
        // Handle the specific individual errors such as incorrect passwords
    

不幸的是,我不确定如何从Task&lt;AuthResult&gt; 对象中收集特定的错误代码。我知道我可以收集 ExceptionToast 这条消息,但我更愿意在正确的错误代码上执行切换,而不是使用 String 解释发生的错误。

【问题讨论】:

你可以参考我这里的回答,我觉得会很有帮助***.com/a/37860491/5303797 不要使用 FirebaseError 类,因为来自文档 Represents API errors. This is for internal usage only and we don't expose externally. 【参考方案1】:

如果您的代码已经有 onCompleteListener,那么我不建议您添加 onFailureListner 只是获取有关异常的信息,因为它会增加侦听器的数量。 您可以得到如下错误代码和消息。

@Override
public void onComplete(@NonNull Task<AuthResult> task) 
    //If authentication fails
    if (!task.isSuccessful()) 
        String message = task.getException().getMessage();
        String localizedMessage = task.getException().getLocalizedMessage();
        String errorCode = ((FirebaseAuthInvalidUserException) task.getException()).getErrorCode();
    

我会建议使用本地化消息而不是只使用消息,因为本地化消息很短并且有足够的信息来解决错误。

【讨论】:

【参考方案2】:

您必须添加onFailureListner() 使用下面的代码,您可以获得错误代码:

.addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 
                if (e instanceof FirebaseAuthInvalidCredentialsException) 
    notifyUser("Invalid password");
 else if (e instanceof FirebaseAuthInvalidUserException) 

    String errorCode = 
    ((FirebaseAuthInvalidUserException) e).getErrorCode();

    if (errorCode.equals("ERROR_USER_NOT_FOUND")) 
        notifyUser("No matching account found");
     else if (errorCode.equals("ERROR_USER_DISABLED")) 
        notifyUser("User account has been disabled");
     else 
        notifyUser(e.getLocalizedMessage());
    

            
     );

您应该开发的notifyUser() 方法可以显示Toast 或snackbar 或对话框

【讨论】:

【参考方案3】:

我曾为此苦苦挣扎,但找到了答案。试一试:

@Override
public void onComplete(@NonNull Task<AuthResult> task) 
    if (task.isSuccessful()) 
        Toast.makeText(activity, "Authentication completed.",
        Toast.LENGTH_SHORT).show();

     else 
        Toast.makeText(activity, "Authentication failed:" +      
        task.getException(), Toast.LENGTH_SHORT).show();
    

获取我使用的异常:task.getException()

祝你好运

【讨论】:

【参考方案4】:

更好用

task.getException().getMessage()

为用户获取格式正确的消息

【讨论】:

以上是关于如何从 Firebase Task<AuthResult> 登录失败中检索错误代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 firebase.auth().onAuthStateChanged 中提取数据

如何从 firebase_auth 测试“signInWithEmailAndPassword”

如何从 Firebase.auth.currentUser Android Kotlin 获取刷新令牌

如何从应用程序远程强制注销firebase auth用户

如何将 Firebase Auth Token 从客户端传递到服务器?

Firebase 规则如何获取“request.auth.uid”字段?