64
votes

I've set up Firebase email/password authentication successfully, but for security reasons I want the user to confirm her/his email. It says on Firebases website:

When a user signs up using an email address and password, a confirmation email is sent to verify their email address.

But when I sign up, I doesn't receive a confirmation email.

I've looked and can only find a code for sending the password reset email, but not a code for sending the email confirmation.

I've looked here:

https://firebase.google.com/docs/auth/ios/manage-users#send_a_password_reset_email

anyone got a clue about how I can do it?

7
You linked to the iOS documentation, but the accepted answer uses JavaScript. Which one are you using (so that I can retag the question to match the platform used)?Frank van Puffelen
I can't seem to locate .sendEmailVerification() in Android version. Has anyone managed to use email verification in Firebase on Android?Android
firebase.google.com/support/releases Missing API to start email verification flow.Diveno
Email address verification is currently an experimental feature on iOS and Web.Sunday G Akinsete
With the new API, how do I check is user is verified?Simone

7 Answers

124
votes

I noticed that the new Firebase email authentication docs is not properly documented.

firebase.auth().onAuthStateChanged(function(user) {
  user.sendEmailVerification(); 
});

Do note that:

  1. You can only send email verification to users object whom you created using Email&Password method createUserWithEmailAndPassword
  2. Only after you signed users into authenticated state, Firebase will return a promise of the auth object.
  3. The old onAuth method has been changed to onAuthStateChanged.

To check if email is verified:

firebase.auth().onAuthStateChanged(function(user) { 
  if (user.emailVerified) {
    console.log('Email is verified');
  }
  else {
    console.log('Email is not verified');
  }
});
11
votes

After creating a user a User object is returned, where you can check if the user's email has been verified or not.

When a user has not been verified you can trigger the sendEmailVerification method on the user object itself.

firebase.auth()
    .createUserWithEmailAndPassword(email, password)
    .then(function(user){
      if(user && user.emailVerified === false){
        user.sendEmailVerification().then(function(){
          console.log("email verification sent to user");
        });
      }
    }).catch(function(error) {
      // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;

      console.log(errorCode, errorMessage);
    });

You can also check by listening to the AuthState, the problem with the following method is, that with each new session (by refreshing the page), a new email is sent.

firebase.auth().onAuthStateChanged(function(user) {
  user.sendEmailVerification(); 
});
5
votes

You can send verification email and check if was verified as follow into the AuthListener:

mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {

//---- HERE YOU CHECK IF EMAIL IS VERIFIED

                if (user.isEmailVerified()) {
                    Toast.makeText(LoginActivity.this,"You are in =)",Toast.LENGTH_LONG).show();
                } 

                else {

//---- HERE YOU SEND THE EMAIL

                    user.sendEmailVerification();
                    Toast.makeText(LoginActivity.this,"Check your email first...",Toast.LENGTH_LONG).show();
                }

            } else {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
            // [START_EXCLUDE]
            updateUI(user);
            // [END_EXCLUDE]
        }
    };
2
votes

if you're using compile "com.google.firebase:firebase-auth:9.2.0" and compile 'com.google.firebase:firebase-core:9.2.0' the method sendEmailVerification() will not be resolved until you update to 9.8.0 or higher. It wasted most of time before I figured it out.

0
votes

I have been looking at this too. It seems like firebase have changed the way you send the verification. for me

user.sendEmailVerification() 

did not work. If you get an error such as user.sendEmailVerification() doesn't exist. use the following.

firebase.auth().currentUser.sendEmailVerification()
0
votes

You could send a verification email to any user whose email is linked to the Firebase Auth account. For example, in Flutter you could do. something like :

Future<void> signInWithCredentialAndLinkDetails(AuthCredential authCredential,
    String email, String password) async {
  // Here authCredential is from Phone Auth
  _auth.signInWithCredential(authCredential).then((authResult) async {
    if (authResult.user != null) {
      var emailAuthCredential = EmailAuthProvider.getCredential(
        email: email,
        password: password,
      );
      authResult.user
          .linkWithCredential(emailAuthCredential)
          .then((authResult,onError:(){/* Error Logic */}) async {
        if (authResult.user != null) {
          await authResult.user.sendEmailVerification().then((_) {
            debugPrint('verification email send');
          }, onError: () {
            debugPrint('email verification failed.');
          });
        }
      });
    }
  });
}
0
votes

It's not the answer to the question but might help someone. Don't forget to add your site domain to the Authorised domains list under Sign-in-method