74

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?

9
  • 2
    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)? May 25, 2016 at 13:56
  • I can't seem to locate .sendEmailVerification() in Android version. Has anyone managed to use email verification in Firebase on Android?
    – Android
    May 26, 2016 at 0:50
  • firebase.google.com/support/releases Missing API to start email verification flow.
    – Diego
    May 31, 2016 at 10:05
  • 1
    Email address verification is currently an experimental feature on iOS and Web. Aug 13, 2016 at 13:18
  • 1
    With the new API, how do I check is user is verified?
    – Simone
    Oct 15, 2016 at 11:39

8 Answers 8

129

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');
  }
});
12
  • Thank you, I've been looking for this answer, Do you know how to check if the email has been confirmed?
    – Benja0906
    May 25, 2016 at 9:28
  • 2
    firebase.auth().onAuthStateChanged(function(user) { (user.emailVerified) ? console.log('Email is verified') : console.log('Email is not verified') }); May 25, 2016 at 9:33
  • 1
    firebaser here Great answer @XavierJ.Wong. I added a note that we need to add this to the documentation. May 25, 2016 at 13:59
  • 6
    @FrankvanPuffelen Still not in the docs. It is nicely stated in the auth email templates page, yet there's no documentation anywhere on it, except this answer.
    – KhoPhi
    Jun 18, 2016 at 17:32
  • 1
    @FrankvanPuffelen I've never understood how, but people can create "google.com" accounts with non-Google email addresses - and the emailVerified flag will return false but attempting to sendEmailVerification won't do anything. Is there any way to differentiate this case so that we can ignore the verification state - or is this a bug in Firebase?
    – andygeers
    Sep 4, 2019 at 9:30
13

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(); 
});
3
  • 3
    sendEmailVerification() after createUserWithEmailAndPassword is not working. At that time user.emailVerfied is undefined. Sending email should always happen onAuthStateChanged
    – sungyong
    Mar 19, 2019 at 8:29
  • 5
    The callback for createUserWithEmailAndPassword(...).then receives a firebase.auth.UserCredential, not a firebase.User. Just use then(credential => credential.user.emailVerified ... ) instead.
    – Andy
    Apr 9, 2019 at 9:36
  • 2
    @Andy : According to the Firebase Doc here, I use then((userRecord) => { userRecord.user.sendEmailVerification()... }), but it says Cannot read property 'sendEmailVerification' of undefined. Jun 20, 2020 at 20:09
12

The confirmation email could be in your spam folder. Check your spam folder.

4
  • 1
    This was it for me! Oct 12, 2022 at 17:20
  • 2
    🤦🏻‍♂️🤦🏻‍♂️🤦🏻‍♂️🤦🏻‍♂️🤦🏻‍♂️🤦🏻‍♂️🤦🏻‍♂️
    – Almog C
    Oct 18, 2022 at 12:44
  • Yesss by the time I realized this I had 30+ verification emails in my spam folder 😅
    – Val
    Mar 16, 2023 at 22:05
  • haha happens <3
    – Hussein Hn
    Apr 12, 2023 at 10:13
5

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

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
1

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()
1

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

0

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.');
              });
            }
          });
        }
      });
    }

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.