#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...
});
}
//...
}