Как связать несколько поставщиков аутентификации с учетной записью Firebase на Android?

#android #firebase #firebase-authentication

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

Вопрос:

Я ссылался на документацию на странице Firebase. Моя проблема в этом абзаце:

Вызов linkWithCredential завершится ошибкой, если учетные данные уже связаны с другой учетной записью пользователя. В этой ситуации вы должны обработать объединение учетных записей и связанных данных в соответствии с требованиями вашего приложения:

FirebaseUser prevUser = currentUser; currentUser = auth.signInWithCredential(credential).await().getUser(); // Merge
prevUser and currentUser accounts and data // ...

Я не могу понять, как добавить этот код в мой проект. Когда и куда мне поместить этот код

 auth.signInWithCredential(credential).await().getUser(); 
  

в мой java-файл? Android Studio объявила мне, что не может разрешить await() метод.

Что мне следует сделать, чтобы решить эту проблему. Заранее благодарю вас!

Ответ №1:

Вы должны обработать эту часть кода, когда вызов linkWithCredentials завершается неудачно.

Вот небольшой пример :

 mAuth.getCurrentUser().linkWithCredential(credentials).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if (!task.isSuccessful()) {
           FirebaseUser prevUser = currentUser; 
           try {
             currentUser = Tasks.await(auth.signInWithCredential(credential)).getUser();
           } catch (Exception e) {
             e.printStackStrace();
           }
           // Merge prevUser and currentUser accounts and data 
           // ...
        } else {

        }
    }
});
  

ПРИМЕЧАНИЕ: Task.await() больше не существует, вместо этого вы должны использовать статический метод Tasks.await(…).

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

1. Хорошо, позвольте мне попробовать это

2. я все еще нет. вы?

3. @Adrin Lamit откуда мы получим учетные данные «linkWithCredential (учетные данные)»??

Ответ №2:

Предположим, что:

  • One account per email address настройка включена при аутентификации firebase
  • Пользователь входит в систему с анонимной аутентификацией

linkWithCredential Обычно сбой происходит с FirebaseAuthUserCollisionException помощью, это может произойти либо потому, что эти учетные данные использовались для входа в систему раньше (вы можете проверить, выполнив поиск по этому адресу электронной почты в firebase console), либо эта учетная запись электронной почты использовалась для входа в систему раньше, но с другими поставщиками (например, пользователь, вошедший в систему с помощью abc@gmail.com используя Google для входа в систему раньше, теперь он/ она использует abc@gmail.com но с помощью входа в Facebook) Чтобы справиться с этим, вам нужно выполнить 2 шага:

Шаг 1: ссылка с анонимной учетной записью

 private void linkWithAnonymousAccount(final AuthCredential credential) {
    mFirebaseAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        getFirebaseToken();
                    } else {
                        Exception exception = task.getException();
                        if (exception instanceof FirebaseAuthUserCollisionException) {
                            signInWithFirebase(credential);
                        } else {
                            Utils.showDialogMessage(mContext, task.getException().getLocalizedMessage());
                        }
                    }
                }
            });
}
  

Шаг 2: войдите в firebase

 private void signInWithFirebase(AuthCredential credential) {        
    mFirebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        getFirebaseToken();
                    } else {
                        Utils.showDialogMessage(mContext, task.getException().getLocalizedMessage());
                    }
                }
            });
}
  

Google говорит, что шаг 2 — это слияние, потому что после входа в систему вам нужно получить информацию о предыдущем пользователе и ввести ее в нового пользователя.

Я надеюсь, что это полезно.

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

1. Что означает метод getFirebaseToken()?

2. Если у вас есть собственный сервер, после аутентификации с помощью firebase вы должны получить токен firebase для отправки на ваш сервер для проверки. Подробности можно найти здесь firebase.google.com/docs/auth/admin/verify-id-tokens

3. Нет, у меня нет собственного серверной части. Как я могу продолжить работу с firebase?

4. Если у вас нет собственного серверной части, вы можете продолжить, не получая идентификатор токена firebase, например, вы можете перейти к активности на главном экране. После успешного входа в систему вы можете получить доступ к информации о пользователе или базе данных, созданной в firebase console.