Autenticar usando Apple y Unity

Puede permitir que sus usuarios se autentiquen con Firebase utilizando su ID de Apple mediante el SDK de Firebase para llevar a cabo el flujo de inicio de sesión de OAuth 2.0 de un extremo a otro.

Antes de que empieces

Para iniciar sesión como usuario con Apple, primero configure Iniciar sesión con Apple en el sitio para desarrolladores de Apple y luego habilite Apple como proveedor de inicio de sesión para su proyecto de Firebase.

Únase al programa de desarrolladores de Apple

Iniciar sesión con Apple solo lo pueden configurar los miembros del Programa de desarrolladores de Apple .

Configurar Iniciar sesión con Apple

El inicio de sesión de Apple debe estar habilitado y configurado correctamente en su proyecto de Firebase. La configuración de Apple Developer varía según las plataformas Android y Apple. Siga la sección "Configurar el inicio de sesión con Apple" de las guías de iOS+ y/o Android antes de continuar.

Habilite Apple como proveedor de inicio de sesión

  1. En Firebase console , abre la sección Auth . En la pestaña Método de inicio de sesión , habilite el proveedor de Apple .
  2. Configure los ajustes del proveedor de inicio de sesión de Apple:
    1. Si está implementando su aplicación solo en plataformas Apple, puede dejar vacíos los campos ID de servicio, ID de equipo Apple, clave privada e ID de clave.
    2. Para soporte en dispositivos Android:
      1. Agrega Firebase a tu proyecto de Android . Asegúrese de registrar la firma SHA-1 de su aplicación cuando la configure en Firebase console.
      2. En Firebase console , abre la sección Auth . En la pestaña Método de inicio de sesión , habilite el proveedor de Apple . Especifique el ID de servicio que creó en la sección anterior. Además, en la sección de configuración del flujo de código OAuth, especifique su ID de equipo Apple y la clave privada y el ID de clave que creó en la sección anterior.

Cumplir con los requisitos de datos anonimizados de Apple

Iniciar sesión con Apple ofrece a los usuarios la opción de anonimizar sus datos, incluida su dirección de correo electrónico, al iniciar sesión. Los usuarios que eligen esta opción tienen direcciones de correo electrónico con el dominio privaterelay.appleid.com . Cuando utiliza Iniciar sesión con Apple en su aplicación, debe cumplir con las políticas o términos de desarrollador aplicables de Apple con respecto a estos ID de Apple anónimos.

Esto incluye obtener el consentimiento del usuario requerido antes de asociar cualquier información personal de identificación directa con una ID de Apple anónima. Cuando se utiliza la autenticación de Firebase, esto puede incluir las siguientes acciones:

  • Vincula una dirección de correo electrónico a una ID de Apple anónima o viceversa.
  • Vincular un número de teléfono a una ID de Apple anónima o viceversa
  • Vincula una credencial social no anónima (Facebook, Google, etc.) a una ID de Apple anónima o viceversa.

La lista de arriba no es exhaustiva. Consulte el Acuerdo de licencia del programa para desarrolladores de Apple en la sección Membresía de su cuenta de desarrollador para asegurarse de que su aplicación cumpla con los requisitos de Apple.

Accede a la clase Firebase.Auth.FirebaseAuth

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;

Maneja el flujo de inicio de sesión con el SDK de Firebase

El proceso para iniciar sesión con Apple varía según las plataformas Apple y Android.

En plataformas Apple

  1. Instale un complemento de terceros para manejar el inicio de sesión de Apple y la generación de tokens, como el paquete de inicio de sesión con Apple Asset Storage de Unity . Es posible que deba modificar el código para conectar la cadena nonce aleatoria generada en su estado de cadena sin formato para usarla en las operaciones de Firebase (es decir, almacenar una copia antes de crear el formulario de resumen SHA256 del nonce).

  2. Utilice la cadena de token resultante y el nonce sin formato para crear una credencial de Firebase e iniciar sesión en Firebase.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    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);
    });
    

  3. Se puede usar el mismo patrón con ReauthenticateAsync , que se puede usar para recuperar credenciales nuevas para operaciones confidenciales que requieren un inicio de sesión reciente. Para obtener más información, consulte Administrar usuarios .

  4. Al vincular con Apple Sign In en plataformas Apple, es posible que encuentre un error que indique que una cuenta de Firebase existente ya se ha vinculado a la cuenta de Apple. Cuando esto ocurre, se generará una Firebase.Auth.FirebaseAccountLinkException en lugar de la Firebase.FirebaseException estándar. En este caso, la excepción incluye una propiedad UserInfo.UpdatedCredential que, si es válida, se puede usar para iniciar sesión en el usuario vinculado a Apple a través de FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync . La credencial actualizada evita la necesidad de generar un nuevo token de inicio de sesión de Apple con nonce para la operación de inicio de sesión.

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

En Android

En Android, autentique a sus usuarios con Firebase integrando el inicio de sesión OAuth genérico basado en web en su aplicación usando el SDK de Firebase para llevar a cabo el flujo de inicio de sesión de principio a fin.

Para manejar el flujo de inicio de sesión con el SDK de Firebase, sigue estos pasos:

  1. Construya una instancia de FederatedOAuthProviderData configurada con el ID de proveedor apropiado para Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Opcional: Especifique ámbitos de OAuth 2.0 adicionales además del valor predeterminado que desea solicitar al proveedor de autenticación.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. Opcional: si desea mostrar la pantalla de inicio de sesión de Apple en un idioma que no sea inglés, configure el parámetro locale . Consulte los documentos Iniciar sesión con Apple para conocer las configuraciones regionales admitidas.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. Una vez que se hayan configurado los datos de su proveedor, utilícelos para crear un FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Autentíquese con Firebase utilizando el objeto del proveedor de autenticación. Tenga en cuenta que, a diferencia de otras operaciones de FirebaseAuth, esto tomará el control de su interfaz de usuario al mostrar una vista web en la que el usuario puede ingresar sus credenciales.

    Para iniciar el flujo de inicio de sesión, llame a signInWithProvider :

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. Se puede usar el mismo patrón con ReauthenticateWithProvider , que se puede usar para recuperar credenciales nuevas para operaciones confidenciales que requieren un inicio de sesión reciente.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. Y puede utilizar LinkWithCredentialAsync() para vincular diferentes proveedores de identidad a cuentas existentes.

    Tenga en cuenta que Apple requiere que obtenga el consentimiento explícito de los usuarios antes de vincular sus cuentas de Apple a otros datos.

    Por ejemplo, para vincular una cuenta de Facebook a la cuenta actual de Firebase, use el token de acceso que obtuvo al iniciar sesión en Facebook:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( 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;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

Iniciar sesión con Apple Notes

A diferencia de otros proveedores compatibles con Firebase Auth, Apple no proporciona una URL de foto.

Además, cuando el usuario elige no compartir su correo electrónico con la aplicación, Apple proporciona una dirección de correo electrónico única para ese usuario (del formato xyz@privaterelay.appleid.com ), que comparte con su aplicación. Si configuró el servicio de retransmisión de correo electrónico privado, Apple reenvía los correos electrónicos enviados a la dirección anónima a la dirección de correo electrónico real del usuario.

Apple solo comparte información del usuario, como el nombre para mostrar, con las aplicaciones la primera vez que un usuario inicia sesión. Por lo general, Firebase almacena el nombre para mostrar la primera vez que un usuario inicia sesión en Apple, que puede obtener con auth.CurrentUser.DisplayName . Sin embargo, si anteriormente usaste Apple para iniciar sesión como usuario en la aplicación sin usar Firebase, Apple no proporcionará a Firebase el nombre para mostrar del usuario.

Próximos pasos

Después de que un usuario inicia sesión por primera vez, se crea una nueva cuenta de usuario y se vincula a las credenciales (es decir, el nombre de usuario y la contraseña, el número de teléfono o la información del proveedor de autenticación) con las que el usuario inició sesión. Esta nueva cuenta se almacena como parte de su proyecto de Firebase y se puede usar para identificar a un usuario en cada aplicación de su proyecto, independientemente de cómo inicie sesión el usuario.

En tus aplicaciones, puedes obtener la información básica del perfil del usuario desde el objeto Firebase.Auth.FirebaseUser. Consulte Administrar usuarios .

En las reglas de seguridad de Firebase Realtime Database y Cloud Storage, puede obtener el ID de usuario único del usuario que inició sesión a partir de la variable de autenticación y usarlo para controlar a qué datos puede acceder un usuario.