Para permitir que los usuarios accedan a la app con varios proveedores de autenticación, puedes vincular las credenciales de estos proveedores con una cuenta de usuario existente. Los usuarios se pueden identificar con el mismo ID de usuario de Firebase, sin importar el proveedor de autenticación que hayan usado para acceder. Por ejemplo, un usuario que accedió con una contraseña puede vincular una Cuenta de Google y después usar cualquiera de los dos métodos para acceder. Por otra parte, un usuario anónimo puede vincular una cuenta de Facebook y luego acceder con Facebook para continuar usando la app.
Antes de comenzar
Agrega compatibilidad para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a la app.
Vincula las credenciales del proveedor de autenticación con una cuenta de usuario
Para vincular las credenciales del proveedor de autenticación con una cuenta de usuario existente:
- Permite que el usuario acceda mediante cualquier proveedor o método de autenticación.
- Completa el flujo de acceso del proveedor de autenticación nuevo, pero solamente hasta el paso anterior a llamar a uno de los métodos
firebase::auth::Auth::SignInWithCredential
. Por ejemplo, obtén el token de ID de Google, el token de acceso de Facebook o el correo electrónico y la contraseña del usuario. Obtén una
Acceso con Googlefirebase::auth::Credential
para el proveedor de autenticación nuevo:firebase::auth::Credential credential = firebase::auth::GoogleAuthProvider::GetCredential(google_id_token, nullptr);
Acceso con Facebookfirebase::auth::Credential credential = firebase::auth::FacebookAuthProvider::GetCredential(access_token);
Acceso con correo electrónico y contraseñafirebase::auth::Credential credential = firebase::auth::EmailAuthProvider::GetCredential(email, password);
Pasa el objeto
firebase::auth::Credential
al métodoLinkWithCredential
del usuario que accedió:// Link the new credential to the currently active user. firebase::auth::User current_user = auth->current_user(); firebase::Future<firebase::auth::AuthResult> result = current_user.LinkWithCredential(credential);
La llamada a
LinkWithCredential
fallará si ya se vincularon las credenciales con la cuenta de otro usuario. En esta situación, debes administrar la fusión de las cuentas y los datos asociados según corresponda para la app:// Gather data for the currently signed in User. firebase::auth::User current_user = auth->current_user(); std::string current_email = current_user.email(); std::string current_provider_id = current_user.provider_id(); std::string current_display_name = current_user.display_name(); std::string current_photo_url = current_user.photo_url(); // Sign in with the new credentials. firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential); // To keep example simple, wait on the current thread until call completes. while (result.status() == firebase::kFutureStatusPending) { Wait(100); } // The new User is now active. if (result.error() == firebase::auth::kAuthErrorNone) { firebase::auth::User* new_user = *result.result(); // Merge new_user with the user in details. // ... (void)new_user; }
Si la llamada a LinkWithCredential
se hace correctamente, el usuario podrá acceder con cualquier proveedor de autenticación vinculado para usar los mismos datos en Firebase.
Desvincula un proveedor de autenticación de una cuenta de usuario
Puedes desvincular un proveedor de autenticación de una cuenta para que el usuario ya no pueda acceder con ese proveedor.
Para desvincular un proveedor de autenticación de una cuenta de usuario, pasa el ID del proveedor al método Unlink
. Para obtener los ID de los proveedores de autenticación vinculados a un usuario, puedes llamar a ProviderData
.
// Unlink the sign-in provider from the currently active user. firebase::auth::User current_user = auth->current_user(); firebase::Future<firebase::auth::AuthResult> result = current_user.Unlink(providerId);