Firebase + Flutter: не может заблокировать доступ к непроверенным учетным записям электронной почты - PullRequest
0 голосов
/ 20 апреля 2020

Я хотел бы заблокировать людей, которые не подтвердили свою электронную почту, поэтому я нашел этот код для регистрации:

// sign up

  Future signUp(String email, String password) async {
    

    try {
      await _auth.createUserWithEmailAndPassword(
          email: email, password: password);
    } catch (e) {
      print('An error has occured by creating a new user');
      print(
        e.toString(),
      );
    }

    try {
      final FirebaseUser _user = await _auth.currentUser();
      await _user.sendEmailVerification();
    } catch (error) {
      print("An error occured while trying to send email verification");
      print(error.toString());
    }
    try {
      await _auth.signOut();
    } catch (err) {
      print(err);
    }
  }

и это для входа:

//Sign In with Email and Pass

  Future signInWithEmailAndPassword(String email, String password) async {

FirebaseUser _user = await FirebaseAuth.instance.currentUser();

if (_user != null && _user.isEmailVerified == true) {
  try {
    await _auth.signInWithEmailAndPassword(
        email: email, password: password);
    return _user;
  } catch (e) {
    return null;
  }
} else {
  return null;
}
  }

_auth - это всего лишь экземпляр FirebaseAuth. Проблема в том, что я могу войти в систему, даже если я не подтвердил адрес электронной почты.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

isEmailVerified может быть немного проблем для правильной работы. Удостоверьтесь, что вы звоните

 await FirebaseAuth.instance.currentUser()..reload();

, прежде чем вы звоните isEmailVerified также на своем собственном опыте, и я не знаю, если это просто что-то, что я делал неправильно, но это не сработало с моей Auth Класс это не начал работать, пока я не поместил код непосредственно в initState() моего виджета, который проверяет, проверен ли пользователь. Как я и сказал, эта часть могла быть чем-то, что я сделал неправильно Как указано, это не будет прослушивать изменения, вы должны проверять себя либо периодически, либо в тот момент, когда вы знаете, что электронная почта подтверждена.

Future(() async {
      _timer = Timer.periodic(Duration(seconds: 10), (timer) async {
        await FirebaseAuth.instance.currentUser()
          ..reload();
        var user = await FirebaseAuth.instance.currentUser();
        if (user.isEmailVerified) {
          timer.cancel();
          Navigator.of(context).popAndPushNamed(HearingsScreen.routeName);
        }
      });
    });

Поэтому он проверяет каждые 10 секунд, чтобы убедиться, что пользователь не подтвердил свою электронную почту. самое элегантное решение. На странице, на которой у меня есть эта страница, просто отображается сообщение «Пожалуйста, подтвердите вашу электронную почту», поэтому не похоже, что это прерывает другой код. Если ваше приложение выполняет другие задачи, это может не подойти вам. Если вы хотите поиграть с isEmailVerified go впереди, но я потратил целую неделю головных болей, пока не остановился на этом.

0 голосов
/ 20 апреля 2020

Firebase Auth не останавливает вход в аккаунты, если пользователь еще не подтвердил свой адрес электронной почты. Вы можете проверить это свойство _user.isEmailVerified, чтобы узнать состояние этой проверки после того, как пользователь войдет в систему, и оттуда можно определить, что должен видеть пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...