2016-11-03 39 views
8

Tôi đang đăng ký người dùng của mình bằng cách sử dụng phương thức mật khẩu và email của Firebase. như thế này:Cách gửi email xác minh với Firebase?

mAuth.createUserWithEmailAndPassword(email, password) 

.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
    @Override 
    public void onComplete(@NonNull Task<AuthResult> task) { 

    if (task.isSuccessful()) { 

     FirebaseUser signed = task.getResult().getUser(); 

     writeNewUser(signed.getUid()); 

     new android.os.Handler().postDelayed(

       new Runnable() { 
        public void run() { 

         updateUser(b); 

        } 
       }, 3000); 

    } else { 

     new android.os.Handler().postDelayed(

       new Runnable() { 
        public void run() { 

         onSignupFailed(); 

        } 
       }, 3000); 

    } 

    } 
}); 

Sau khi email của người dùng đã được đăng ký thành công, tôi muốn Firebase gửi email xác minh. Tôi biết điều này có thể sử dụng số điện thoại sendEmailVerification của Firebase. Ngoài việc gửi email này, tôi muốn tài khoản của người dùng bị vô hiệu hóa cho đến khi họ xác minh email. Điều này cũng sẽ yêu cầu sử dụng tính năng isEmailVerified của Firebase. Tuy nhiên, tôi đã không thành công trong việc nhận được Firebase để gửi email xác minh, tôi không thể tìm ra để vô hiệu hóa và kích hoạt tài khoản gửi email xác minh và sau khi nó đã được xác minh.

+3

có thể trùng lặp của [Email xác nhận bằng căn cứ hỏa lực 3.0 trên Android] (http://stackoverflow.com/questions/37418518/email-verification-using-firebase-3-0-on-android) –

Trả lời

2

Sử dụng FirebaseAuth.getInstance().getCurrentUser().sendEmailVerification()FirebaseAuth.getInstance().getCurrentUser().isEmailVerified()

Không có cách nào để vô hiệu hóa tài khoản thông qua các căn cứ hỏa lực SDK. Điều bạn có thể làm là sử dụng mã số GetTokenResult chứa Mã thông báo xác thực Firebase và xác thực nó dựa trên chương trình phụ trợ tùy chỉnh của bạn hoặc đặt cờ cho cơ sở dữ liệu Firebase tương ứng với người dùng đó. Cá nhân tôi sẽ đi với cờ trong cơ sở dữ liệu Firebase

+0

đây là một phần của giải pháp nhưng không trả lời được câu hỏi của tôi. – amigo

+0

Tôi đã cập nhật câu trả lời của mình –

+0

Cảm ơn bạn. Tôi nghĩ rằng công việc xung quanh mà tôi sẽ sử dụng là chỉ cần tạo một mật khẩu mặc định, sau đó gửi một thiết lập lại mật khẩu. Thông báo trước cho người dùng để đặt mật khẩu mới khi họ muốn đăng nhập lần đầu tiên. – amigo

17

Câu hỏi này là về cách sử dụng Firebase để gửi email xác minh. OP không thể tìm ra cách vô hiệu hóa và kích hoạt tài khoản gửi email xác minh và sau khi nó đã được xác minh.

Ngoài ra, tài liệu này không được ghi lại chính xác trong tài liệu firebase. Vì vậy, tôi đang viết một quy trình từng bước mà một người nào đó có thể làm theo nếu anh ta/cô ấy đang đối mặt với vấn đề.

1) Người dùng có thể sử dụng phương thức createUserWithEmailAndPassword.

Ví dụ:

mAuth.createUserWithEmailAndPassword(email, password) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         Log.d("TAG", "createUserWithEmail:onComplete:" + task.isSuccessful()); 

         // If sign in fails, display a message to the user. If sign in succeeds 
         // the auth state listener will be notified and logic to handle the 
         // signed in user can be handled in the listener. 
         if (!task.isSuccessful()) { 
          // Show the message task.getException() 
         } 
         else 
         { 
          // successfully account created 
          // now the AuthStateListener runs the onAuthStateChanged callback 
         } 

         // ... 
        } 
       }); 

Nếu tài khoản mới được tạo ra, người dùng cũng đã đăng nhập, và AuthStateListener chạy callback onAuthStateChanged. Trong cuộc gọi lại, bạn có thể quản lý công việc gửi email xác minh tới người dùng.

Ví dụ:

onCreate(...// 
mAuthListener = new FirebaseAuth.AuthStateListener() { 
    @Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
     FirebaseUser user = firebaseAuth.getCurrentUser(); 
     if (user != null) { 
      // User is signed in 
      // NOTE: this Activity should get onpen only when the user is not signed in, otherwise 
      // the user will receive another verification email. 
      sendVerificationEmail(); 
     } else { 
      // User is signed out 

     } 
     // ... 
    } 
}; 

Bây giờ email gửi xác minh có thể được viết như sau:

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 

            //restart this activity 
            overridePendingTransition(0, 0); 
            finish(); 
            overridePendingTransition(0, 0); 
            startActivity(getIntent()); 

         } 
        } 
       }); 
    } 

Bây giờ đến LoginActivity:

đây nếu người dùng là suc cessfully đăng nhập sau đó chúng tôi chỉ đơn giản là có thể gọi một phương pháp mà bạn đang viết logic để kiểm tra nếu email được xác minh hay không.

Ví dụ:

mAuth.signInWithEmailAndPassword(email, password) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         //Log.d("TAG", "signInWithEmail:onComplete:" + task.isSuccessful()); 

         // If sign in fails, display a message to the user. If sign in succeeds 
         // the auth state listener will be notified and logic to handle the 
         // signed in user can be handled in the listener. 
         if (!task.isSuccessful()) { 
          //Log.w("TAG", "signInWithEmail:failed", task.getException()); 

         } else { 
          checkIfEmailVerified(); 
         } 
         // ... 
        } 
       }); 

Bây giờ xem xét các phương pháp checkIfEmailVerified:

private void checkIfEmailVerified() 
{ 
    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. 
     // NOTE: don't forget to log out the user. 
     FirebaseAuth.getInstance().signOut(); 

     //restart this activity 

    } 
} 

Vì vậy, ở đây tôi đang kiểm tra nếu email được xác minh hay không.Nếu không, sau đó đăng xuất người dùng.

Vì vậy, đây là cách tiếp cận của tôi để theo dõi mọi thứ đúng cách.

+0

Theo mã của bạn, làm cách nào để kiểm tra xem email có được xác minh hay không ?. Nó sẽ thành công signIn. Nhưng bạn nên xác minh e-mail trước, sau đó bạn phải đăng nhập, đó là cách chính xác. Bạn có thể giúp tôi để có được cách chính xác không? – Simon

+0

@Simon đoạn mã cuối cùng của câu trả lời của tôi là làm những gì bạn muốn. cho phép người dùng đăng nhập và sau đó kiểm tra xem email của họ có được xác minh hay không. Nếu email không được xác minh thì hãy đăng xuất người dùng. –

+0

Tôi đã làm tất cả, email xác minh được gửi và tôi đã nhấp vào liên kết, Nhưng user.isEmailVerified() không hoạt động. – Simon

0

gửi xác minh để bạn Email

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

kiểm tra nếu người dùng xác nhận

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
boolean emailVerified = user.isEmailVerified(); 
Các vấn đề liên quan