#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.