Подтвердить что ты не робот

Проверка электронной почты Firebase не работает должным образом

ЧТО Я ЛЮБЛЮ

Я использую Firebase Authentication в своем приложении, где пользователи могут зарегистрироваться с помощью Email и Пароль. Если пользователи не подтвердили свою электронную почту, я отключу некоторые функции, пока они не подтвердят свой адрес электронной почты.

У меня также есть кнопка для явного запуска проверки почты, которая просто вызывает, sendEmailVerification(). Он отлично работает и всегда отправляется письмо с подтверждением.

ПРОБЛЕМА

Пользователь получает проверочные письма, но когда он/она проверяет его и возвращается в приложение, isEmailVerified() всегда является ложным. Поэтому мое приложение по-прежнему не позволяет пользователю использовать все функции, несмотря на то, что он/она подтвердил свою электронную почту.

Но если они снова выйдут и войдут в систему, isEmailVerified() немедленно вернет true. Но нехорошо выйти из системы и снова войти в систему.

Это ошибка в Firebase? Или я делаю что-то неправильно?

4b9b3361

Ответ 1

Эй, я знаю, что это довольно старый поток, но что решило проблему для меня FIRAuth.auth()?.currentUser.reload(completion: { (error) in ... })

Для тех, кто сталкивается с этой проблемой. И я использую последнюю версию Firebase 10.0.1

UPDATE

Firebase изменила имена своих функций, так как я опубликовал свое решение.

Обратите внимание, что все изменения в текущих пользовательских состояниях можно наблюдать, добавив stateDidChangeListener. Auth.auth()?. currentUser не обновляется немедленно, поэтому я сделал, чтобы сохранить текущего пользователя в глобальную переменную, которую я создал и поддерживал сам.

Auth.auth().addStateDidChangeListener { (auth, user) in
 // ...
}

Всякий раз, когда вы вызываете Auth.auth()?.currentUser.reload(), обновленный и готовый к использованию пользовательский объект будет передан через stateDidChangeListener.

Затем вы можете проверить любые обновленные данные (например, с помощью электронной почты)

Ответ 2

Вы должны перезагрузить своего пользователя Firebase после того, как отправили письмо с подтверждением.

 mAuth.createUserWithEmailAndPassword(inputEmail.getText().toString(), inputPassword.getText().toString())
    .addOnCompleteListener(ResetPasswordActivity.this, task -> {
        user = mAuth.getCurrentUser();user.reload();
        if(mAuth.getCurrentUser().isEmailVerified()){
            next();//intent to next activity
        } else {               
            mAuth.getCurrentUser().sendEmailVerification().addOnCompleteListener(task1 -> System.out.println("function"));
        }
        if (task.isSuccessful()) {
            user = mAuth.getCurrentUser();
            System.out.println(user.isEmailVerified());
        }
    }

Вот оно!

Ответ 3

Подписка на состояние авторизации пользователя может решить эту "ошибку".

constructor(
    public afAuth: AngularFireAuth,
    public router: Router
  ) {
    this.afAuth.authState.subscribe(user => {
      // here you verify if the user is emailVerified BEFORE storing him in local storage.
      // if you want to keep storing the user even
      // before email verification, you need to work out this logic
      if (user && user.emailVerified) {
        this.userData = user;
        localStorage.setItem('user', JSON.stringify(this.userData));
        JSON.parse(localStorage.getItem('user'));
      } else {
        localStorage.setItem('user', null);
        JSON.parse(localStorage.getItem('user'));
      }
    })
  }