Iniciar sessão de utilizadores com a Apple no Android

Este documento mostra como usar a Identity Platform para adicionar a opção Iniciar sessão com a Apple à sua app Android.

Antes de começar

Configurar a sua app com a Apple

No site do programador da Apple:

  1. Siga os passos em Configure o início de sessão com a Apple para a Web. Isto inclui:

    1. Registar um URL de retorno, que tem o seguinte aspeto:

      https://project-id.firebaseapp.com/__/auth/handler
      
    2. A alojar temporariamente um ficheiro no seguinte URL para validar o seu domínio:

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

    Além disso, tome nota do seu ID dos serviços e ID da equipa Apple. Vai precisá-los na secção seguinte.

  2. Use uma chave privada da Apple para criar um início de sessão. Vai precisar da chave e do respetivo ID na secção seguinte.

  3. Se usar a Identity Platform para enviar emails aos seus utilizadores, configure o seu projeto com o serviço de retransmissão de email privado da Apple usando o seguinte email:

    noreply@project-id.firebaseapp.com
    

    Também pode usar um modelo de email personalizado, se a sua app tiver um.

Agir em conformidade com os requisitos de dados anónimos da Apple

A Apple dá aos utilizadores a opção de anonimizar os respetivos dados, incluindo o endereço de email. A Apple atribui aos utilizadores que selecionam esta opção um endereço de email ocultado com o domínio privaterelay.appleid.com.

A sua app tem de estar em conformidade com todas as políticas ou termos de programadores aplicáveis da Apple relativamente a IDs Apple anónimos. Isto inclui obter o consentimento do utilizador antes de associar quaisquer informações de identificação pessoal (IIP) a um ID Apple anónimo. As ações que envolvem PII incluem, entre outras:

  • Associar um endereço de email a um ID Apple anónimo ou vice-versa.
  • Associar um número de telefone a um ID Apple anónimo ou vice-versa
  • Associar uma credencial social não anónima, como o Facebook ou o Google, a um ID Apple anónimo ou vice-versa.

Para mais informações, consulte o Contrato de Licença do Programa para Programadores da Apple para a sua conta de programador da Apple.

Configurar a Apple como fornecedor

Para configurar a Apple como um Fornecedor de identidade:

  1. Aceda à página Fornecedores de identidade na Google Cloud consola.

    Aceda à página Fornecedores de identidade

  2. Clique em Adicionar um fornecedor.

  3. Selecione Apple na lista.

  4. Em Plataforma, selecione Android.

  5. Introduza o seu ID de serviços, ID da equipa Apple, ID da chave e chave privada.

  6. Registe os domínios da sua app clicando em Adicionar domínio em Domínios autorizados. Para fins de programação, o localhost já está ativado por predefinição.

  7. Em Configure a sua aplicação, clique em Android. Copie o fragmento para o código da sua app para inicializar o SDK do cliente do Identity Platform.

  8. Clique em Guardar.

Iniciar sessão de utilizadores com o SDK do cliente

  1. Crie uma instância do objeto fornecedor OAuthProvider com o ID apple.com:

    Java

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

    Kotlin

    val provider = OAuthProvider.newBuilder("apple.com")
    
  2. Opcional: adicione âmbitos do OAuth. Os âmbitos especificam os dados que está a pedir à Apple. Os dados mais confidenciais podem exigir âmbitos específicos. Por predefinição, quando a opção Uma conta por endereço de email está ativada, o Identity Platform pede os âmbitos email e name.

    Java

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

    Kotlin

    provider.setScopes(arrayOf("email", "name"))
    
  3. Opcional: localize o fluxo de autenticação. Pode especificar um idioma ou usar o idioma predefinido do 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. Inicie sessão do utilizador com a Identity Platform.

    1. Verifique se já existe uma resposta chamando 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")
      }
      

      O início de sessão coloca a sua atividade em segundo plano, o que significa que o sistema pode recuperá-la durante o fluxo de autenticação. A verificação da presença de um resultado evita que o utilizador tenha de iniciar sessão duas vezes.

    2. Se não houver nenhum resultado pendente, ligue para 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)
        }
      

Ao contrário de muitos outros fornecedores de identidade, a Apple não fornece um URL de foto.

Se um utilizador optar por não partilhar o respetivo email real com a sua app, a Apple disponibiliza um endereço de email exclusivo para esse utilizador partilhar. Este email tem o formato xyz@privaterelay.appleid.com. Se configurou o serviço de retransmissão de email privado, a Apple encaminha os emails enviados para o endereço anónimo para o endereço de email real do utilizador.

A Apple só partilha informações do utilizador, como nomes a apresentar, com as apps na primeira vez que um utilizador inicia sessão. Na maioria dos casos, a Identity Platform armazena estes dados, o que lhe permite obtê-los através de firebase.auth().currentUser.displayName durante sessões futuras. No entanto, se permitiu que os utilizadores iniciassem sessão na sua app através da Apple antes da integração com a Identity Platform, as informações dos utilizadores não estão disponíveis.

O que se segue?