Esegui l'autenticazione con Apple e Unity

Puoi consentire agli utenti di autenticarsi con Firebase utilizzando il proprio ID Apple tramite l'SDK Firebase per eseguire il flusso di accesso OAuth 2.0 end-to-end.

Prima di iniziare

Per consentire agli utenti di accedere utilizzando Apple, configura prima Accedi con Apple sul sito per sviluppatori di Apple, quindi attiva Apple come provider di accesso per il tuo progetto Firebase.

Partecipa al programma per sviluppatori Apple

La funzionalità Accedi con Apple può essere configurata solo dai membri di Apple Developer Google Cloud.

Configura Accedi con Apple

La funzionalità Accedi con Apple deve essere attivata e configurata correttamente nel progetto Firebase. La configurazione di Apple Developer varia a seconda delle piattaforme Android e Apple. Segui la sezione "Configura Accedi con Apple" sezione del iOS+ e/o Guide di Android prima procedere.

Abilita Apple come provider di accesso

  1. Nella console Firebase, apri la sezione Autorizzazione. Nella scheda Metodo di accesso, attiva il provider Apple.
  2. Configura le impostazioni del provider di Accesso con Apple:
    1. Se esegui il deployment dell'app solo sulle piattaforme Apple, puoi lasciare vuoti i campi ID servizio, ID team Apple, chiave privata e ID chiave.
    2. Per assistenza sui dispositivi Android:
      1. Aggiungi Firebase al tuo progetto Android. Essere assicurati di registrare la firma SHA-1 dell'app quando configuri l'app nel Console Firebase.
      2. Nella console Firebase, apri la sezione Auth. Nella scheda Metodo di accesso, attiva il provider Apple. Specifica l'ID servizio che hai creato nella sezione precedente. Inoltre, nel codice OAuth di configurazione del flusso, specifica il tuo ID team Apple e la chiave privata e l'ID chiave che hai creato nella sezione precedente.

Rispettare i requisiti dei dati anonimizzati di Apple

Accedi con Apple offre agli utenti la possibilità di anonimizzare i propri dati, incluso l'indirizzo email, quando accedono. Utenti che scelgono questa opzione hanno indirizzi email con il dominio privaterelay.appleid.com. Quando utilizzi Accedi con Apple nella tua app, devi rispettare eventuali norme o termini per gli sviluppatori di Apple applicabili in merito a questi ID Apple anonimizzati.

Ciò include l'ottenimento del consenso dell'utente richiesto prima di associare informazioni personali che consentono l'identificazione diretta a un ID Apple anonimizzato. Quando utilizzi Firebase Authentication, potresti includere quanto segue: azioni:

  • Collega un indirizzo email a un ID Apple anonimo o viceversa.
  • Collegare un numero di telefono a un ID Apple anonimizzato o viceversa
  • Collegare una credenziale social non anonima (Facebook, Google e così via) a un ID Apple anonimo o viceversa.

L'elenco riportato sopra non è esaustivo. Fai riferimento all'Apple Developer Program il Contratto di licenza nella sezione Abbonamento del tuo account sviluppatore per assicurati che la tua app soddisfi i requisiti di Apple.

Accedere al corso Firebase.Auth.FirebaseAuth

La classe FirebaseAuth è il gateway per tutte le chiamate API. È accessibile tramite FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Gestire il flusso di accesso con l'SDK Firebase

La procedura per accedere con Apple varia a seconda delle piattaforme Apple e Android.

Su piattaforme Apple

  1. Installa un plug-in di terze parti per gestire la generazione di token e nonce di accesso con Apple, ad esempio il pacchetto di archiviazione asset di Unity per l'accesso con Apple. Potresti dover modificare il codice per collegare la stringa nonce casuale generata nel suo stato di stringa non elaborata per utilizzarla nelle operazioni di Firebase (ovvero memorizzare una copia prima della creazione della forma digest SHA256 del nonce).

  2. Utilizzare la stringa di token risultante e un nonce non elaborato per creare un Firebase Creiamo la credenziale e accedi a 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. È possibile usare lo stesso pattern con ReauthenticateAsync, che può essere utilizzato per recuperare nuove credenziali per le operazioni sensibili che richiedono accesso recente. Per ulteriori informazioni, vedi Gestisci utenti.

  4. Quando ti colleghi a Accedi con Apple sulle piattaforme Apple, potresti riscontrare un errore che ti informa che l'account Firebase esistente è già stato collegato all'account Apple. In questo caso verrà generato un Firebase.Auth.FirebaseAccountLinkException anziché il Firebase.FirebaseException standard. In questo caso, l'eccezione include una proprietà UserInfo.UpdatedCredential che, se valida, può essere utilizzata per accedere all'utente collegato ad Apple tramite FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. La credenziale aggiornata elude la necessità di generare un nuovo token Accedi con Apple con un nonce per l'operazione di accesso.

    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
            }
          }
        });

Su Android

Su Android, puoi autenticare gli utenti con Firebase integrando le un accesso OAuth generico nell'app utilizzando l'SDK Firebase per eseguire la termina il flusso di accesso.

Per gestire il flusso di accesso con l'SDK Firebase:

  1. Costruisci un'istanza di un FederatedOAuthProviderData configurato con l'ID provider appropriato per Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Facoltativo: specifica gli ambiti OAuth 2.0 aggiuntivi rispetto a quelli predefiniti che vuoi richiedere al provider di autenticazione.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. Facoltativo: se vuoi visualizzare la schermata di accesso di Apple in una lingua diversa dall'inglese, imposta il parametro locale. Consulta le Accedi con la documentazione di Apple per i paesi supportati.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. Una volta configurati i dati del provider, utilizzali per creare un FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Esegui l'autenticazione con Firebase utilizzando l'oggetto provider Auth. Tieni presente che, a differenza di altre operazioni di FirebaseAuth, questa acquisirà il controllo dell'interfaccia utente mostrando una visualizzazione web in cui l'utente può inserire le proprie credenziali.

    Per avviare il flusso di accesso, chiama 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. È possibile usare lo stesso pattern con ReauthenticateWithProvider, che può essere utilizzato per recuperare nuove credenziali per le operazioni sensibili che richiedono accesso recente.

    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. Inoltre, puoi utilizzare LinkWithCredentialAsync() per collegare diversi provider di identità agli account esistenti.

    Tieni presente che Apple ti richiede di ottenere il consenso esplicito degli utenti prima di collegare i loro account Apple ad altri dati.

    Ad esempio, per collegare un account Facebook all'account Firebase corrente, utilizza il token di accesso che hai ottenuto per aver consentito l'accesso dell'utente a 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);
        });
    

Accedere con Note di Apple

A differenza di altri provider supportati da Firebase Auth, Apple non fornisce una l'URL della foto.

Inoltre, quando l'utente sceglie di non condividere il proprio indirizzo email con l'app, Apple fornisce un indirizzo email univoco per l'utente (del tipo xyz@privaterelay.appleid.com), che condivide con la tua app. Se hai configurato il servizio di inoltro email privato, Apple inoltra le email inviate all'indirizzo anonimizzato all'indirizzo email reale dell'utente.

Apple condivide i dati dell'utente, ad esempio il nome visualizzato, solo con le app la prima volta che un utente esegue l'accesso. Di solito, Firebase memorizza il nome visualizzato la prima volta che un utente accede con Apple, un'opzione che puoi ottenere con auth.CurrentUser.DisplayName. Tuttavia, se in precedenza hai utilizzato Apple per consentire a un utente di accedere all'app senza utilizzando Firebase, Apple non fornirà a Firebase il nome visualizzato dell'utente.

Passaggi successivi

Dopo che un utente ha eseguito l'accesso per la prima volta, viene creato un nuovo account utente e collegato alle credenziali, ovvero nome utente e password, numero di telefono o informazioni del fornitore di autenticazione, con cui l'utente ha eseguito l'accesso. Questo nuovo account viene archiviato come parte del progetto Firebase e può essere utilizzato per identificare un utente in ogni app del progetto, indipendentemente da come l'utente esegue l'accesso.

Nelle tue app, puoi recuperare le informazioni di base del profilo dell'utente dall'oggetto Firebase.Auth.FirebaseUser. Vedi Gestire gli utenti.

Nelle regole di sicurezza di Firebase Realtime Database e Cloud Storage, puoi ottenere l'ID utente univoco dell'utente che ha eseguito l'accesso dalla variabile auth e utilizzarlo per controllare i dati a cui può accedere.