Как объединить пользователей Firebase при использовании Google Sign In после входа по электронной почте? - PullRequest
0 голосов
/ 09 марта 2020

Приложение My Flutter позволяет выполнять вход по электронной почте + пароль, а также через Google SignIn.

Я хотел бы зарегистрировать пользователя в своей учетной записи через Google SignIn, если они ранее регистрировались с тем же электронным адресом. mail.

Таким образом, поток может выглядеть следующим образом:

  1. Пользователь автоматически регистрируется анонимно при запуске
  2. Пользователь входит в систему с учетными данными (электронная почта + пароль) и их анонимная учетная запись связана с этой новой учетной записью
  3. Пользователь выходит из системы и входит в новую анонимную учетную запись
  4. Пользователь входит в систему с помощью Google SignIn
  5. Я хотел бы этот пользователь будет связан со своей предыдущей учетной записью Firebase . Анонимный аккаунт из шага 3 должен быть удален.

Вот как я получаю учетные данные Google:

  final firebaseUser = await firebaseAuth.currentUser();

  final googleUser = await googleSignIn.signIn();
  final googleAuth = await googleUser.authentication;

  final googleCredential = GoogleAuthProvider.getCredential(
    accessToken: googleAuth.accessToken,
    idToken: googleAuth.idToken,
  );

Затем я проверяю, заходил ли пользователь ранее с паролем:

  final providers = await firebaseAuth.fetchSignInMethodsForEmail(
      email: googleUser.email);
  final signedViaPassword = providers.contains('password');

Когда пользователь уже зарегистрировался только через Google, войдите в систему:

    final authResult =
        await firebaseAuth.signInWithCredential(googleCredential);
    await _updateUserDocumentAfterGoogleSignIn(authResult, googleUser);

    return SignInGoogleResult(wasSuccessful: true, newUserCreated: false);

Когда пользователь новый:

    logger.logInfo('New user, need to link with anonymous');
    final authResult =
        await firebaseUser.linkWithCredential(googleCredential);

    await _updateUserDocumentAfterGoogleSignIn(authResult, googleUser);

    return SignInGoogleResult(wasSuccessful: true, newUserCreated: true);

А теперь я бы хотел обработать случай, когда пользователь уже зарегистрировался с паролем. Я думаю, что должен получить доступ к пользователю Firebase, который зарегистрировался с паролем, и связать его с этой учетной записью Google, но я не знаю, как с этим справиться.

...