You can allow users to sign in to your app using multiple authentication providers by linking auth provider credentials to an existing user account. Users are identifiable by the same Firebase user ID regardless of the authentication provider they used to sign in. For example, a user who signed in with a password can link a Google account and sign in with either method in the future. Or, an anonymous user can link a Facebook account and then, later, sign in with Facebook to continue using your app.
Прежде чем начать
Добавьте в свое приложение поддержку двух или более поставщиков аутентификации (возможно, включая анонимную аутентификацию).
Привяжите учетные данные поставщика аутентификации к учетной записи пользователя.
Чтобы связать учетные данные поставщика аутентификации с существующей учетной записью пользователя:
Войдите в систему, используя любой поставщик или метод аутентификации.
Завершите процесс авторизации для нового поставщика аутентификации, включая вызов одного из методов
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("Unknown error.");
}
}
Поиск неисправностей
Если при попытке связать несколько учетных записей возникают ошибки, обратитесь к документации по подтвержденным адресам электронной почты .