Вы можете разрешить пользователям входить в ваше приложение с помощью нескольких поставщиков проверки подлинности, связав учетные данные поставщика проверки подлинности с существующей учетной записью пользователя. Пользователи идентифицируются по одному и тому же идентификатору пользователя Firebase независимо от поставщика аутентификации, который они использовали для входа. Например, пользователь, вошедший в систему с помощью пароля, может связать учетную запись Google и входить в систему любым методом в будущем. Или анонимный пользователь может связать учетную запись Facebook, а затем, позже, войти в систему с помощью Facebook, чтобы продолжить использовать ваше приложение.
Прежде чем вы начнете
Добавьте в свое приложение поддержку двух или более поставщиков аутентификации (возможно, включая анонимную аутентификацию).
Связать учетные данные поставщика аутентификации с учетной записью пользователя
Чтобы связать учетные данные поставщика аутентификации с существующей учетной записью пользователя:
Войдите в систему с помощью любого поставщика или метода проверки подлинности.
Завершите процесс входа для нового поставщика проверки подлинности вплоть до вызова одного из методов
signInWith
, но не включая его. Например, получите токен Google ID пользователя, токен доступа Facebook или адрес электронной почты и пароль.Получите объект
Credential
для нового поставщика аутентификации:// Google Sign-in final credential = GoogleAuthProvider.credential(idToken: idToken); // Email and password sign-in final credential = EmailAuthProvider.credential(email: emailAddress, password: password); // Etc.
Передайте объект
Credential
в методlinkWithCredential()
пользователя, выполнившего вход:try { final userCredential = await FirebaseAuth.instance.currentUser ?.linkWithCredential(credential); } on FirebaseAuthException catch (e) { switch (e.code) { case "provider-already-linked": print("The provider has already been linked to the user."); break; case "invalid-credential": print("The provider's credential is not valid."); break; case "credential-already-in-use": print("The account corresponding to the credential already exists, " "or is already linked to a Firebase User."); break; // See the API reference for the full list of error codes. default: print("Unknown error."); } ```
Если вызов linkWithCredential()
успешно, пользователь теперь может войти в систему, используя любого связанного поставщика аутентификации, и получить доступ к тем же данным Firebase.
Отключить поставщика аутентификации от учетной записи пользователя
Вы можете отменить связь поставщика аутентификации с учетной записью, чтобы пользователь больше не мог входить в систему с помощью этого поставщика.
Чтобы отвязать поставщика аутентификации от учетной записи пользователя, передайте идентификатор поставщика в метод unlink()
. Вы можете получить идентификаторы провайдеров аутентификации, связанных с пользователем, из свойства providerData
объекта User
.
try {
await FirebaseAuth.instance.currentUser?.unlink(providerId);
} on FirebaseAuthException catch (e) {
switch (e.code) {
case "no-such-provider":
print("The user isn't linked to the provider or the provider "
"doesn't exist.");
break;
default:
print("Unkown error.");
}
}