Vincular varios proveedores de autenticación a una cuenta en Unity

Puede permitir que los usuarios inicien sesión en su aplicación utilizando múltiples proveedores de autenticación vinculando las credenciales del proveedor de autenticación a una cuenta de usuario existente. Los usuarios son identificables por el mismo ID de usuario de Firebase independientemente del proveedor de autenticación que utilizaron para iniciar sesión. Por ejemplo, un usuario que inició sesión con una contraseña puede vincular una cuenta de Google e iniciar sesión con cualquiera de los métodos en el futuro. O bien, un usuario anónimo puede vincular una cuenta de Facebook y luego, iniciar sesión en Facebook para continuar usando su aplicación.

Antes de que empieces

Agregue soporte para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a su aplicación.

La clase FirebaseAuth es la puerta de entrada para todas las llamadas API. Se puede acceder a él a través de FirebaseAuth.DefaultInstance .
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Para vincular las credenciales del proveedor de autenticación a una cuenta de usuario existente:

  1. Inicie sesión como usuario utilizando cualquier proveedor o método de autenticación.
  2. Complete el flujo de inicio de sesión para el nuevo proveedor de autenticación hasta llamar a uno de los métodos Firebase.Auth.FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync , pero sin incluirlo. Por ejemplo, obtenga el token de identificación de Google del usuario, el token de acceso de Facebook o el correo electrónico y la contraseña.
  3. Obtenga una Firebase.Auth.Credential para el nuevo proveedor de autenticación:

    Inicio de sesión con Google
    Firebase.Auth.Credential credential =
        Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken);
    
    Inicio de sesión con Facebook
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(accessToken);
    
    Inicio de sesión con contraseña de correo electrónico
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
    
  4. Pase el objeto Firebase.Auth.Credential al método LinkWithCredentialAsync del usuario que inició sesión:

    auth.CurrentUser.LinkWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("LinkWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });
    

    La llamada a LinkWithCredentialAsync fallará si las credenciales ya están vinculadas a otra cuenta de usuario. En esta situación, debe gestionar la combinación de las cuentas y los datos asociados según corresponda para su aplicación:

    // Gather data for the currently signed in User.
    string currentUserId = auth.CurrentUser.UserId;
    string currentEmail = auth.CurrentUser.Email;
    string currentDisplayName = auth.CurrentUser.DisplayName;
    System.Uri currentPhotoUrl = auth.CurrentUser.PhotoUrl;
    
    // Sign in with the new credentials.
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    
      // TODO: Merge app specific details using the newUser and values from the
      // previous user, saved above.
    });
    

Si la llamada a LinkWithCredentialAsync tiene éxito, el usuario ahora puede iniciar sesión con cualquier proveedor de autenticación vinculado y acceder a los mismos datos de Firebase.

Puede desvincular un proveedor de autenticación de una cuenta, de modo que el usuario ya no pueda iniciar sesión con ese proveedor.

Para desvincular un proveedor de autenticación de una cuenta de usuario, pase el ID del proveedor al método UnlinkAsync . Puede obtener los ID de los proveedores de autenticación vinculados a un usuario llamando ProviderData .

// Unlink the sign-in provider from the currently active user.
// providerIdString is a string identifying a provider,
// retrieved via FirebaseAuth.FetchProvidersForEmail().
auth.CurrentUser.UnlinkAsync(providerIdString).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("UnlinkAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("UnlinkAsync encountered an error: " + task.Exception);
    return;
  }

  // The user has been unlinked from the provider.
  Firebase.Auth.AuthResult result = task.Result;
  Debug.LogFormat("Credentials successfully unlinked from user: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});