簡體   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