Письмо с подтверждением Firebase не отправляется

Я успешно настроил аутентификацию по электронной почте / паролю Firebase, но по соображениям безопасности я хочу, чтобы пользователь подтвердил свой адрес электронной почты. На сайте Firebases написано:

Когда пользователь регистрируется с использованием адреса электронной почты и пароля, ему отправляется электронное письмо с подтверждением для проверки его адреса электронной почты.

Но когда я регистрируюсь, я не получаю письмо с подтверждением.

Я просмотрел и нашел только код для отправки электронного письма для сброса пароля, но не код для отправки электронного письма с подтверждением.

Я смотрел здесь:

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

Кто-нибудь знает, как я могу это сделать?


person Benja0906    schedule 25.05.2016    source источник
comment
Вы связались с документацией iOS, но в принятом ответе используется JavaScript. Какой из них вы используете (чтобы я мог изменить теги вопроса в соответствии с используемой платформой)?   -  person Frank van Puffelen    schedule 25.05.2016
comment
Кажется, я не могу найти .sendEmailVerification () в версии Android. Кому-нибудь удалось использовать проверку электронной почты в Firebase на Android?   -  person Android    schedule 26.05.2016
comment
firebase.google.com/support/releases Отсутствует API для запуска процесса проверки электронной почты.   -  person Diveno    schedule 31.05.2016
comment
Проверка адреса электронной почты в настоящее время является экспериментальной функцией для iOS и в Интернете.   -  person Sunday G Akinsete    schedule 13.08.2016
comment
Проверьте последнюю версию 9.6.1. Этот метод доступен здесь: firebase.google.com/docs/auth/android/ управлять-пользователями   -  person krawiec    schedule 13.10.2016
comment
Как с новым API проверить, подтвержден ли пользователь?   -  person Simone    schedule 15.10.2016
comment
Укажите соответствующий тег для этого вопроса.   -  person Ojonugwa Jude Ochalifu    schedule 23.01.2017
comment
проверка электронной почты в android   -  person Ojonugwa Jude Ochalifu    schedule 23.01.2017


Ответы (7)


Я заметил, что новые документы аутентификации электронной почты Firebase не документированы должным образом.

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

Обратите внимание, что:

  1. Вы можете отправить подтверждение по электронной почте только тем объектам пользователей, которые вы создали с помощью метода электронной почты и пароля createUserWithEmailAndPassword.
  2. Только после того, как вы вошли пользователей в состояние аутентификации, Firebase вернет обещание объекта аутентификации.
  3. Старый метод onAuth был изменен на onAuthStateChanged.

Чтобы проверить, подтвержден ли адрес электронной почты:

firebase.auth().onAuthStateChanged(function(user) { 
  if (user.emailVerified) {
    console.log('Email is verified');
  }
  else {
    console.log('Email is not verified');
  }
});
person Xavier J. Wong    schedule 25.05.2016
comment
Спасибо, я искал этот ответ. Вы знаете, как проверить, подтверждено ли электронное письмо? - person Benja0906; 25.05.2016
comment
firebase.auth (). onAuthStateChanged (функция (пользователь) {(user.emailVerified)? console.log ('Электронная почта подтверждена'): console.log ('Электронная почта не подтверждена')}); - person Xavier J. Wong; 25.05.2016
comment
Спасибо, это очень помогло :) - person Benja0906; 25.05.2016
comment
firebaser здесь Отличный ответ @ XavierJ.Wong. Я добавил примечание, что нам нужно добавить это в документацию. - person Frank van Puffelen; 25.05.2016
comment
@FrankvanPuffelen Все еще не в документации. Это красиво указано на странице шаблонов электронной почты для аутентификации, но нигде нет документации, кроме этого ответа. - person KhoPhi; 18.06.2016
comment
Тем же! Спасибо за этот ответ. Не могу поверить, что этого нет в документации. - person SeBsZ; 23.09.2016
comment
@ XavierJ.Wong Не могли бы вы предоставить ссылку на остальную документацию? - person Umer Farooq; 15.07.2017
comment
Так вы говорите каждый раз, когда authStateChanges вы хотите отправить электронное письмо? - person Oliver Dixon; 14.12.2017
comment
@OliverDixon authStateChanges относится к наблюдателю на объекте Auth, поскольку обычно он не доступен сразу во время инициализации. Отправка электронного письма в этом смысле означает ответ на исходный вопрос об автоматической отправке подтверждения электронной почты с помощью функций Firebase для возвращенного объекта User. - person Xavier J. Wong; 25.12.2017
comment
Могу я спросить, хороший ли это подход к постоянному сеансу в приложении, поддерживающем реакцию? Вызывая onAuthStateChange в главном App.js или отправляя в функцию саги? - person Michael Stokes; 13.03.2018
comment
@FrankvanPuffelen Я никогда не понимал, как это сделать, но люди могут создавать учетные записи google.com с адресами электронной почты, отличными от Google - и флаг emailVerified вернет false, но попытка sendEmailVerification ничего не даст. Есть ли способ дифференцировать этот случай, чтобы мы могли игнорировать состояние проверки - или это ошибка в Firebase? - person andygeers; 04.09.2019

После создания пользователя возвращается объект User, в котором вы можете проверить, подтверждена ли электронная почта пользователя или нет.

Если пользователь не был проверен, вы можете запустить метод sendEmailVerification для самого объекта пользователя.

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

Вы также можете проверить, прослушав AuthState, проблема со следующим методом заключается в том, что с каждым новым сеансом (путем обновления страницы) отправляется новое электронное письмо.

firebase.auth().onAuthStateChanged(function(user) {
  user.sendEmailVerification(); 
});
person tdhulster    schedule 15.09.2017
comment
sendEmailVerification() после createUserWithEmailAndPassword не работает. В то время user.emailVerfied это undefined. Отправка электронной почты должна происходить всегда onAuthStateChanged - person sungyong; 19.03.2019
comment
Обратный вызов для createUserWithEmailAndPassword(...).then получает firebase.auth.UserCredential, а не firebase.User. Просто используйте вместо этого then(credential => credential.user.emailVerified ... ). - person Andy; 09.04.2019
comment
@Andy: согласно Firebase Doc здесь, я использую then((userRecord) => { userRecord.user.sendEmailVerification()... }), но там написано Cannot read property 'sendEmailVerification' of undefined. - person Antonio Ooi; 20.06.2020

Вы можете отправить письмо с подтверждением и проверить, было ли оно подтверждено, как показано ниже в 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]
        }
    };
person Pablo Prado    schedule 04.11.2016

если вы используете компиляцию com.google.firebase: firebase-auth: 9.2.0 и компилируете com.google.firebase: firebase-core: 9.2.0 ', метод sendEmailVerification () не будет разрешен, пока вы не обновите до 9.8.0 или выше. Я потратил впустую большую часть времени, прежде чем я это понял.

person MbaiMburu    schedule 14.05.2017

Я тоже смотрел на это. Похоже, что firebase изменила способ отправки подтверждения. для меня

user.sendEmailVerification() 

не работал. Если вы получаете сообщение об ошибке, например, user.sendEmailVerification () не существует. используйте следующее.

firebase.auth().currentUser.sendEmailVerification()
person David Innocent    schedule 30.09.2019

Вы можете отправить письмо с подтверждением любому пользователю, чей адрес электронной почты связан с учетной записью Firebase Auth. Например, во Flutter вы могли бы это сделать. что-то вроде :

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.');
          });
        }
      });
    }
  });
}
person sjsam    schedule 28.02.2020

Это не ответ на вопрос, но может кому-то помочь. Не забудьте добавить домен своего сайта в список авторизованных доменов в разделе Метод входа.

person Binod Kafle    schedule 29.03.2021