Свяжите несколько учетных записей пользователей (один и тот же адрес электронной почты) Firebase

У меня есть возможность, что пользователь может выбрать, хотят ли они войти в систему с помощью Google, Facebook, электронной почты/пароля и т. д.

После тестирования моего приложения произошло следующее:

  1. Я регистрируюсь со своим именем, электронной почтой и паролем
  2. Обработка логики начала работы
  3. Подтвердить моих пользователей авторизации в Firebase (серый значок электронной почты)
  4. Выйти из аккаунта
  5. Теперь я хочу войти в систему с помощью Google (тот же адрес электронной почты, который использовался при регистрации с адресом электронной почты и паролем).
  6. Вход в Google работал
  7. Подтвердить моих авторизованных пользователей в Firebase (серый значок электронной почты изменился на значок Google)
  8. Выйти из аккаунта
  9. Не могу больше войти с электронной почтой и паролем, но вход в Google работал

После некоторых исследований я пришел к Связать несколько поставщиков аутентификации с учетной записью в документации по Android

Я понял, что мне нужно реорганизовать свой код, чтобы не использовать методы FirebaseAuth.signInWith.

Это немного кроме моего логинаEmailAndPassword:

val credential = EmailAuthProvider.getCredential(email, password)

firebaseAuth.currentUser!!.linkWithCredential(credential).addOnCompleteListener{ authTask: Task<AuthResult> ->
    if (authTask.isSuccessful) {

У меня есть «иначе», означающее, что (authTask.isSuccessful) не произошло, и еще одно «если» с FirebaseAuthUserCollisionException

                val exception: java.lang.Exception? = authTask.exception
            if (exception is FirebaseAuthUserCollisionException) {
                linkAndMerge(credential)

Моя цель - связать и объединить, и я не знаю, как связать учетные записи (и электронная почта серая, и Google на Firebase)

    private fun linkAndMerge(credential: AuthCredential) {
    val authenticatedUserMutableLiveData: MutableLiveData<ResponseState<UserModel>> =
        MutableLiveData()

    val prevUser = firebaseAuth.currentUser
    firebaseAuth.signInWithCredential(credential)
        .addOnSuccessListener { result ->
            val currentUser = result.user
            // Merge prevUser and currentUser accounts and data
            // ...

        }
        .addOnFailureListener {
            authenticatedUserMutableLiveData.value = ResponseState.Error("Error")
        }
}

Мои вопросы:

  1. Могу ли я вызвать что-то, чтобы объединить учетные записи prevUser и currentUser. Я просто хочу, чтобы у пользователя была возможность использовать разные аутентификации.
  2. Я не беспокоюсь о данных, потому что если это один и тот же UID пользователя, не имеет значения, является ли поставщик аутентификации
  3. Могу ли я по-прежнему использовать «createUserWithEmailAndPassword»?
0
0
140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Шаги с 1 по 9 обеспечивают ожидаемое поведение. Если вы создадите пользователя с адресом электронной почты и паролем и сразу после этого войдете в систему с помощью Google, учетная запись будет доступна только с помощью Google. Почему? Потому что за кулисами Firebase преобразует учетную запись, созданную с адресом электронной почты и паролем, в учетную запись поставщика Google. К сожалению, вы не можете отменить это изменение.

Ссылка в вашем вопросе относится к возможности привязать существующую учетную запись к определенному провайдеру. Например, если вы реализуете анонимную аутентификацию , вы можете связать этот аккаунт, например, с Google. Это означает, что UID остается прежним.

Если вы хотите, чтобы этот механизм не работал, вам следует рассмотреть возможность создания разных учетных записей для разных поставщиков. Вы можете найти эту опцию, которая называется «Создать несколько учетных записей для каждого поставщика удостоверений» прямо в консоли Firebase, на вкладке «Настройки» внутри «Аутентификации».

Могу ли я помочь вам с другой информацией?

Alex Mamo 25.11.2022 16:12

После твоего выступления все обрело смысл. Я уже делаю некоторые изменения в логике входа. Спасибо.

Mickaël Brás Dias 25.11.2022 18:02

Другие вопросы по теме