Firebase用户验证电子邮件

时间:2018-04-04 09:12:27

标签: android firebase firebase-authentication

我使用Firebase作为移动Android应用程序的后端。当用户注册时,我希望向该用户发送验证电子邮件。

当用户点击" SignUp"按钮,运行以下逻辑:首先,从填充框中设置一些变量。然后对填充参数的有效性进行一些检查。如果检查通过,则在数据库中创建用户。这一切都在运作..

然后,我想向用户发送验证电子邮件,以检查电子邮件是否有效。我也把它放在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();
    }

" SignUp"的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.");
                    }
                }
            });
}

2 个答案:

答案 0 :(得分:0)

将其更改为顺序过程,如@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);
}

答案 1 :(得分:0)

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

  • 创建帐户
  • 检查创作是否成功
  • 检查电子邮件是否已使用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
                }
            }

此外,您应该知道有时电子邮件验证在调试环境中需要一些时间(至少根据我的经验,我看到延迟1-3分钟,但从未发布过版本)。

最后,在致电user.verify()之前,您需要再次致电user.reload()以更新Firebase缓存中的用户数据,否则即使您点击了Verify my email发送到您帐户的电子邮件,FirebaseAuthor.currentUser().isEmailVerified()将继续返回您的错误。