Inicio de sesión de usuarios con Apple en Android

En este documento se explica cómo usar Identity Platform para añadir la opción Iniciar sesión con Apple a tu aplicación Android.

Antes de empezar

Configurar tu aplicación con Apple

En el sitio para desarrolladores de Apple:

  1. Sigue los pasos que se indican en el artículo Configurar la función Iniciar sesión con Apple para la Web. Entre los datos que recoge se incluyen los siguientes:

    1. Registrar una URL de retorno, que tiene este aspecto:

      https://project-id.firebaseapp.com/__/auth/handler
      
    2. Alojamiento temporal de un archivo en la siguiente URL para verificar tu dominio:

      https://project-id.firebaseapp.com/.well-known/apple-developer-domain-association.txt
      

    Además, anota tu ID de servicios y tu ID de equipo de Apple, ya que los necesitarás en la siguiente sección.

  2. Usa una clave privada de Apple para crear un inicio de sesión. Necesitarás la clave y su ID en la siguiente sección.

  3. Si usas Identity Platform para enviar correos a tus usuarios, configura tu proyecto con el servicio de retransmisión de correo privado de Apple con la siguiente dirección de correo:

    noreply@project-id.firebaseapp.com
    

    También puedes usar una plantilla de correo personalizada, si tu aplicación tiene una.

Cumplir los requisitos de Apple sobre datos anonimizados

Apple ofrece a los usuarios la opción de anonimizar sus datos, incluida su dirección de correo electrónico. Apple asigna a los usuarios que seleccionan esta opción una dirección de correo ofuscada con el dominio privaterelay.appleid.com.

Tu aplicación debe cumplir las políticas o los términos para desarrolladores aplicables de Apple en relación con los IDs de Apple anonimizados. Esto incluye obtener el consentimiento del usuario antes de asociar cualquier información personal identificable (IPI) con un ID de Apple anonimizado. Entre las acciones que implican IPI, se incluyen las siguientes:

  • Vincular una dirección de correo a un ID de Apple anonimizado o viceversa.
  • Vincular un número de teléfono a un ID de Apple anonimizado o viceversa
  • Vincular una credencial social no anónima, como Facebook o Google, a un ID de Apple anonimizado, o viceversa.

Para obtener más información, consulta el Acuerdo de Licencia del Programa para Desarrolladores de Apple de tu cuenta de desarrollador de Apple.

Configurar Apple como proveedor

Para configurar Apple como proveedor de identidades, sigue estos pasos:

  1. Ve a la página Proveedores de identidades de la consola de Google Cloud .

    Ir a la página Proveedores de identidades

  2. Haz clic en Añadir un proveedor.

  3. Selecciona Apple en la lista.

  4. En Plataforma, seleccione Android.

  5. Introduce tu ID de servicios, ID de equipo de Apple, ID de clave y clave privada.

  6. Registre los dominios de su aplicación haciendo clic en Añadir dominio en Dominios autorizados. Para actividades de desarrollo, localhost ya está habilitado de forma predeterminada.

  7. En Configura tu aplicación, haz clic en Android. Copia el fragmento en el código de tu aplicación para inicializar el SDK de cliente de Identity Platform.

  8. Haz clic en Guardar.

Inicio de sesión de usuarios con el SDK de cliente

  1. Crea una instancia del objeto proveedor OAuthProvider con el ID apple.com:

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
    

    Kotlin

    val provider = OAuthProvider.newBuilder("apple.com")
    
  2. Opcional: Añade permisos de OAuth. Los permisos especifican los datos que solicitas a Apple. Es posible que los datos más sensibles requieran ámbitos específicos. De forma predeterminada, cuando la opción Una cuenta por dirección de correo electrónico está habilitada, Identity Platform solicita los ámbitos email y name.

    Java

    List<String> scopes =
        new ArrayList<String>() {
          {
            add("email");
            add("name");
          }
        };
    provider.setScopes(scopes);
    

    Kotlin

    provider.setScopes(arrayOf("email", "name"))
    
  3. Opcional: Localiza el flujo de autenticación. Puedes especificar un idioma o usar el idioma predeterminado del dispositivo:

    Java

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr");
    

    Kotlin

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr");
    
  4. Inicia la sesión del usuario con Identity Platform.

    1. Comprueba si ya hay una respuesta llamando al startActivityForSignInWithProvider():

      Java

      mAuth = FirebaseAuth.getInstance();
      Task<AuthResult> pending = mAuth.getPendingAuthResult();
      if (pending != null) {
          pending.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                  Log.d(TAG, "checkPending:onSuccess:" + authResult);
                  // Get the user profile with authResult.getUser() and
                  // authResult.getAdditionalUserInfo(), and the ID
                  // token from Apple with authResult.getCredential().
              }
          }).addOnFailureListener(new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                  Log.w(TAG, "checkPending:onFailure", e);
              }
          });
      } else {
          Log.d(TAG, "pending: null");
      }
      

      Kotlin

      val pending = auth.pendingAuthResult
      if (pending != null) {
          pending.addOnSuccessListener { authResult ->
              Log.d(TAG, "checkPending:onSuccess:$authResult")
              // Get the user profile with authResult.getUser() and
              // authResult.getAdditionalUserInfo(), and the ID
              // token from Apple with authResult.getCredential().
          }.addOnFailureListener { e ->
              Log.w(TAG, "checkPending:onFailure", e)
          }
      } else {
          Log.d(TAG, "pending: null")
      }
      

      Al iniciar sesión, tu actividad pasa a segundo plano, lo que significa que el sistema puede recuperarla durante el flujo de autenticación. Comprobar si un resultado ya está presente evita que el usuario tenga que iniciar sesión dos veces.

    2. Si no hay ningún resultado pendiente, llama a startActivityForSignInWithProvider():

      Java

      mAuth.startActivityForSignInWithProvider(this, provider.build())
          .addOnSuccessListener(
                  new OnSuccessListener<AuthResult>() {
                      @Override
                      public void onSuccess(AuthResult authResult) {
                          // Sign-in successful!
                          Log.d(TAG, "activitySignIn:onSuccess:" + authResult.getUser());
                          FirebaseUser user = authResult.getUser();
                          // ...
                      }
                  })
          .addOnFailureListener(
                  new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception e) {
                          Log.w(TAG, "activitySignIn:onFailure", e);
                      }
                  });
      

      Kotlin

      auth.startActivityForSignInWithProvider(this, provider.build())
        .addOnSuccessListener { authResult ->
            // Sign-in successful!
            Log.d(TAG, "activitySignIn:onSuccess:${authResult.user}")
            val user = authResult.user
            // ...
        }
        .addOnFailureListener { e ->
            Log.w(TAG, "activitySignIn:onFailure", e)
        }
      

A diferencia de muchos otros proveedores de identidad, Apple no proporciona una URL de foto.

Si un usuario decide no compartir su correo real con tu aplicación, Apple le proporcionará una dirección de correo única para que la comparta. Este correo tiene el siguiente formato: xyz@privaterelay.appleid.com. Si has configurado el servicio de retransmisión de correo privado, Apple reenvía los correos enviados a la dirección anonimizada a la dirección de correo real del usuario.

Apple solo comparte información de los usuarios, como los nombres visibles, con las aplicaciones la primera vez que inician sesión. En la mayoría de los casos, Identity Platform almacena estos datos, lo que le permite obtenerlos mediante firebase.auth().currentUser.displayName en sesiones futuras. Sin embargo, si permitiste que los usuarios iniciaran sesión en tu aplicación con Apple antes de integrar Identity Platform, la información de los usuarios no estará disponible.

Siguientes pasos