Flutter Web: google_sign_in_web: работает на настольных компьютерах и iOS. Сбой на Android Chrome

#firebase #google-signin #google-authentication #flutter-web

#firebase #google-вход #google-аутентификация #flutter-web

Вопрос:

Простой код аутентификации, который ссылается на firebase. Код отлично работает в мобильных браузерах iOS Safari и для настольных компьютеров. Сбой входа (зависания) на Android Chrome.

Простой фрагмент кода:

 
final GoogleSignIn googleSignIn = GoogleSignIn();

  Future loginGoogle() async {
    try {
      Print('AAA');
      await googleSignIn.signIn();
      print('BBB');
    } catch (error) {
      print(error);
    }
  }

  //Listener initialized at creation of this class.
  googleSignInListener() {
    return googleSignIn.onCurrentUserChanged.listen((account) async {
      handleSignIn(account);
    }, onError: (err) => print('Error signing in: $err'));
  }
  

При открытии всплывающей вкладки входа в Google на Android появляется сбой. Как только вкладка Google аутентифицируется и автоматически закрывается, вкладка flutter восстанавливается, но ничего не делает. В Android Chrome вывод на консоль показывает только ‘AAA’. Если я затем попытаюсь снова войти в систему после первой неудачной попытки, тот же вывод, только ‘AAA’ и нет всплывающего окна для входа в Google.

Ошибка также не выводится на консоль.

Этот код отлично работает в настольных браузерах и браузере Safari iOS.

Android останавливает приложения на фоновых вкладках Chrome?

Ответ №1:

Я смог заставить это работать. Оказывается, есть два места, где вы должны сообщить Google об Uri веб-сайта, откуда может исходить аутентификация и куда могут быть перенаправлены успешные авторизации. Одно местоположение находится в консоли Google, а другое — под аутентификацией консоли firebase.

Однако мне не удалось заставить пакет google_sign_in_web работать по-прежнему. Я использовал пакет firebase_auth и установил поставщика Google в запросе авторизации. Это отлично работает. Вот фрагмент скорректированного и рабочего кода с использованием firebase_auth

 import 'package:firebase_auth/firebase_auth.dart' as FA;
//...

class Auth with ChangeNotifier {
  final FA.FirebaseAuth firebaseAuth = FA.FirebaseAuth.instance;
  FA.GoogleAuthProvider googleAuthProvider = FA.GoogleAuthProvider();
  StreamSubscription<FA.User> authListener;
  //...

  Auth() {
    authListener = signInListener();
    //...
  }

  Future loginGoogle() async {
    await firebaseAuth.setPersistence(FA.Persistence.LOCAL);
    auth = await firebaseAuth.signInWithPopup(googleAuthProvider);
  }

  signInListener() {
    return firebaseAuth.authStateChanges().listen((_user) async {
      //Auth state changed...
    });
  }

  //...
}