Как работает аутентификация без пароля firebase с динамической ссылкой для приложения flutter?

#firebase #flutter #firebase-authentication

#firebase #flutter #firebase-аутентификация

Вопрос:

Когда я нажимаю на ссылку подтверждения из своего электронного письма, открывается мое приложение, работающее в фоновом режиме, но метод didChangeAppLifecycleState возвращает данные как null и deepLink, установленные в firebase, вместо полной ссылки на электронную почту из моего электронного письма, в результате чего ошибка SignInWithEmailAndLink не выполняется, поскольку предполагается, что он соответствует адресу электронной почты, введенному в виджете по полученной ссылке.

Вот код, взятый из этой статьи https://medium.com/firebase-developers/dive-into-firebase-auth-on-flutter-email-and-link-sign-in-e51603eb08f8 :-

1.Метод didChangeAppLifecycleState

 @override
void didChangeAppLifecycleState(AppLifecycleState state) async {
  if (state == AppLifecycleState.resumed) {
    final PendingDynamicLinkData data =
    await FirebaseDynamicLinks.instance.getInitialLink();
    if( data?.link != null ) {
      handleLink(data?.link);
    }
    FirebaseDynamicLinks.instance.onLink(
        onSuccess: (PendingDynamicLinkData dynamicLink) async {
          final Uri deepLink `enter code here`= dynamicLink?.link;
          handleLink(deepLink);
        }, onError: (OnLinkErrorException e) async {
      print('onLinkError');
      print(e.message);
    });
  }
}
  
  1. Метод handleLink
 void handleLink(Uri link) async {
  if (link != null) {
    final User user = (await _auth.signInWithEmailAndLink(
      email: _userEmail,
      link: link.toString(),
    ))
        .user;
    if (user != null) {
      setState(() {
        _userID = user.uid;
        _success = true;
    });
    } else {
    setState(() {
        _success = false;
      });
    }
  } else {
    setState(() {
      _success = false;
    });
  }
  setState(() {});
}
  
  1. основной метод (инициализация firebase)
 void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
  

Примечание: — Deeplink — это концепция, все еще новая для меня во flutter, поэтому я установил ее случайным образом в firebase. На моей странице регистрации есть WidgetsBindingObserver, который помогает возобновить состояние жизненного цикла приложения. Мой код регистрации и входа находится в виджете электронной почты, и я не использую формы для проверки моих текстовых полей.

Ответ №1:

кажется, что после входа по ссылке электронной почты экземпляр firebase не обновлялся до проверки подлинности.SigninWithEMailLink() вам нужно обновить его в экземпляре firebase следующим образом

   var user= await auth.currentUser();
              await user.reload();
              user=await auth.currentUser();
  

если вы все еще сталкиваетесь с проблемой, пожалуйста, предоставьте еще немного кода, чтобы я правильно понял вашу проблему

Комментарии:

1. Насколько я понимаю, я не могу получить CurrentUser, пока пользователь не зарегистрируется при регистрации (я также не вижу пользователя в firebase). Я предоставил код с более подробной информацией, дайте мне знать, если вы хотите узнать что-нибудь еще.