【问题标题】:Android Firebase AuthStateListener Email VerifiedAndroid Firebase AuthStateListener 电子邮件已验证
【发布时间】:2018-03-16 17:54:52
【问题描述】:

我有一个 Firebase AuthStateListener 的 SignInActivity。

final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
final FirebaseAuth.AuthStateListener firebaseAuthListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(FirebaseAuth auth) {
        FirebaseUser user = auth.getCurrentUser();
        if (user != null && user.isEmailVerified()) {
            firebaseAuth.removeAuthStateListener(this);
            startActivity(new Intent(LoginActivity.this, MainActivity.class));
        }
    }
};
firebaseAuth.addAuthStateListener(firebaseAuthListener);

当我成功注册一个新帐户后,我在活动中setVisibity(View.Visible) 一个带有EditTextEmailVerifyButton 的验证页面(以防有人想重新发送电子邮件验证)。

我想要做的是当我从我的电子邮件帐户验证我的电子邮件时,我希望页面自动启动我的MainActivity,而不是像短信验证那样在收到验证码时在我的LoginActivity 中保持空闲状态短信,应用程序读取短信并导航到MainActivity。是否可以通过电子邮件验证来实现这一点?因为FirebaseAuthState 在我点击电子邮件上的验证链接后从未改变。

我需要OnFirebaseAuthUserEmailVerifiedListener之类的东西

我是 firebase 的新手,请给我一些建议,告诉我如何实现这一点,或者如果它不可行。

【问题讨论】:

  • 我现在已经 10 个月了,因为你开始这个,但我会为未来的读者分享我的想法。我相信您可以在 onStart() 生命周期方法中添加一些代码。此代码将检查用户是否验证了他的电子邮件,如果他验证了,那么您可以做任何您想做的事情。我相信这很好,因为如果用户想要验证他的电子邮件,他必须将您的应用程序置于后台。顺便说一句,我也面临同样的问题,所以如果您找到任何优雅的解决方案,请在此处分享!

标签: java android firebase firebase-authentication


【解决方案1】:

This link真的很有用。

因为即使在我点击电子邮件上的验证链接后,FirebaseAuthState 也不会改变。

那是因为用户被缓存了,需要重新加载用户:

请注意,FirebaseUser 对象缓存在应用会话中,因此如果您想检查用户的验证状态,最好致电.getCurrentUser().reload() 进行更新。

【讨论】:

  • 我应该在哪里调用我的 reload() 方法?
  • 如果您在验证电子邮件之前不允许执行任何操作,您可以自旋循环,即while(!user.isEmailVerified()){ mAuth.getCurrentUser().reload(); },如果您即使使用未验证的电子邮件也可以浏览您的应用程序,您可以添加例如一个带有刷新按钮的 Snackbar,它调用 reload() 方法
  • 感谢您的建议。我将添加 Snackbar 以刷新用户身份验证。
【解决方案2】:

你需要这样的东西

     FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    if (user.isEmailVerified())
    {
        // user is verified, so you can finish this activity or send user to activity which you want.
        finish();
        Toast.makeText(LoginActivity.this, "Successfully logged in", Toast.LENGTH_SHORT).show();
    }
    else
    {
        // email is not verified, so just prompt the message to the user and restart this activity.


        sendVerificationEmail();

    }
}

以及获取emailVerification

的方法
private void sendVerificationEmail(){

    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    user.sendEmailVerification()
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        // email sent
            // after email is sent just logout the user and finish this activity
                        FirebaseAuth.getInstance().signOut();
                        startActivity(new Intent(SignupActivity.this, LoginActivity.class));
                        finish();
                    }
                    else{
                        // email not sent, so display message and restart the activity or do whatever you wish to do

                    }
                }
    });
}

希望对你有所帮助。

【讨论】:

  • 我觉得你真的不明白我的问题。
猜你喜欢
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2021-07-10
  • 2021-10-10
  • 2019-04-03
  • 2018-12-25
相关资源
最近更新 更多