繁体   English   中英

Firebase用户验证电子邮件

[英]Firebase User Verification Email

我将Firebase用作移动Android应用程序的后端。 用户注册后,我想发送一封验证邮件给该用户。

当用户单击“注册”按钮时,将运行以下逻辑:首先,从填充框中设置多个变量。 然后,对填充参数的有效性进行一些检查。 如果检查通过,则会在数据库中创建一个用户。 这一切都起作用。

然后,我想向用户发送验证电子邮件,以检查该电子邮件是否有效。 我也将其放在Button的onClick方法中,但这还无法正常工作。

我没有收到验证电子邮件。 造成此问题和解决方案的原因是什么?

我的onCreate方法

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_sign_up_page);
        setFontType();

        screen = (EditText)findViewById(R.id.SchermNaam);
        mail = (EditText)findViewById(R.id.EmailAdres);
        knop = (Button)findViewById(R.id.SignUp_Button_SignUp);

        firebaseAuth = FirebaseAuth.getInstance();
    }

“注册”按钮的onClick方法:

public void onClickSignUpPage(View view){

    String schermnaam = screen.getText().toString().trim();
    String emailadres = mail.getText().toString().trim();
    String paswoord = pass.getText().toString().trim();

    if(TextUtils.isEmpty(schermnaam)){
        Toast.makeText(this,"Schermnaam invullen", Toast.LENGTH_SHORT).show();
        return;
    }

    if(TextUtils.isEmpty(emailadres)){
        Toast.makeText(this,"Email invullen",Toast.LENGTH_SHORT).show();
        return;
    }

    if(!schermnaam_ok(schermnaam)){
        Toast.makeText(this,"schermnaam minstens 5 en maximum 15 tekens", Toast.LENGTH_SHORT).show();
        return;
    }

    if(!paswoord_ok(paswoord)){
        Toast.makeText(this,"paswoord tussen 6-12 karakters en minstens 1 cijfer", Toast.LENGTH_SHORT).show();
        return;
    }

    firebaseAuth.createUserWithEmailAndPassword(emailadres.trim(),paswoord)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(task.isSuccessful()){
                        Toast.makeText(SignUpPage.this, "Nieuwe Speler Geregistreerd", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(SignUpPage.this, SignInPage.class);
                        startActivity(intent);
                    }
                    else {
                        FirebaseAuthException e = (FirebaseAuthException) task.getException();
                        Toast.makeText(SignUpPage.this,"Fout in de SignUp"+e.getMessage(), Toast.LENGTH_SHORT).show();
                        Log.d("LoginActivity", "Failed Registration", e);
                        return;
                    }
                }
            });

    FirebaseUser user = firebaseAuth.getCurrentUser();

    user.sendEmailVerification()
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Email sent.");
                    }
                }
            });
}

根据@cramopy引用的帖子的建议,将其更改为顺序过程。 这次真是万分感谢!

现在,您首先需要以用户身份“注册”,然后通过另一个按钮进行下一步验证。 然后,我会收到确认电子邮件。

这里我的代码是2个按钮的onClick方法的。从UX的角度来看,需要研究如何放置按钮。 这是功能观点。

public void onClickSignUpPage(View view){

    String schermnaam = screen.getText().toString().trim();
    String emailadres = mail.getText().toString().trim();
    String paswoord = pass.getText().toString().trim();

    if(TextUtils.isEmpty(schermnaam)){
        Toast.makeText(this,"Schermnaam invullen", Toast.LENGTH_SHORT).show();
        return;
    }

    if(TextUtils.isEmpty(emailadres)){
        Toast.makeText(this,"Email invullen",Toast.LENGTH_SHORT).show();
        return;
    }

    if(!schermnaam_ok(schermnaam)){
        Toast.makeText(this,"schermnaam minstens 5 en maximum 15 tekens", Toast.LENGTH_SHORT).show();
        return;
    }

    if(!paswoord_ok(paswoord)){
        Toast.makeText(this,"paswoord tussen 6-12 karakters en minstens 1 cijfer", Toast.LENGTH_SHORT).show();
        return;
    }

    firebaseAuth.createUserWithEmailAndPassword(emailadres.trim(),paswoord)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(task.isSuccessful()){
                        Toast.makeText(SignUpPage.this, "Nieuwe Speler Geregistreerd", Toast.LENGTH_SHORT).show();

                    }
                    else {
                        FirebaseAuthException e = (FirebaseAuthException) task.getException();
                        Toast.makeText(SignUpPage.this,"Fout in de SignUp"+e.getMessage(), Toast.LENGTH_SHORT).show();
                        Log.d("LoginActivity", "Failed Registration", e);
                        return;
                    }
                }
            });

    AddDataFireBase();


}

public void onClickVerify(View view){

    FirebaseUser user = firebaseAuth.getCurrentUser();
    assert user != null;
    user.sendEmailVerification()
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Email sent.");

                    }
                    else {
                        Log.e(TAG, "sendEmailVerification", task.getException());
                        Toast.makeText(SignUpPage.this,
                            "Failed to send verification email.",
                            Toast.LENGTH_SHORT).show();
                }}
            });
    Intent intent = new Intent(SignUpPage.this, SignInPage.class);
    startActivity(intent);
}

您的代码应该可以工作。 但我建议您按照以下步骤来验证电子邮件:

  • 创建帐号
  • 检查创建是否成功
  • 检查电子邮件是否已通过user.isEmailVerified()验证
  • 重新加载用户以使用user.reload()更新实例。 您应该执行此操作,因为Firebase上的某些方法要求您在实现某些操作之前重新加载或重新认证用户。 在这种情况下,重新加载将更新用户的缓存和数据。
  • 使用sendEmailVerification()发送电子邮件

就像是:

  authInstance.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener {
                if (it.isSuccessful) {
                    //Create accountData in the database
                    if (it.result!!.user.isEmailVerified) {
                        it.result!!.user.reload()
                                .addOnCompleteListener {
                                    if (it.isSuccessful) {
                                        authInstance.currentUser!!.sendEmailVerification()
                                                .addOnCompleteListener {
                                                    Log.i("TAG", "Yay! verificationSent")
                                                }
                                    } else {
                                        //Manage error
                                    }
                                }
                    }
                } else {
                    //Manage error
                }
            }

另外,您应该知道有时在Debug环境中进行电子邮件验证会花费一些时间(至少从我的经验来看,我看到的延迟为1-3分钟,但从未发布过)。

最后,在调用user.verify()之前,您应该再次调用user.reload()以更新Firebase缓存中用户的数据,即使没有,即使您单击发送到您的电子邮件的“ Verify my email ”也是如此帐户, FirebaseAuthor.currentUser().isEmailVerified()将继续向您返回false。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM