Esegui l'autenticazione con Apple e Unity

Puoi consentire agli utenti di eseguire l'autenticazione con Firebase utilizzando il loro 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, poi attiva Apple come provider di accesso per il tuo progetto Firebase.

Partecipa all'Apple Developer Program

Accedi con Apple può essere configurato solo dai membri dell'Apple Developer Program.

Configura Accedi con Apple

Accedi con Apple deve essere abilitato e configurato correttamente nel tuo progetto Firebase. La configurazione di Apple Developer varia a seconda delle piattaforme Android e Apple. Prima di procedere, segui la sezione "Configura Accedi con Apple" delle guide iOS+ e/o Android prima di procedere.

Attiva Apple come provider di accesso

  1. Nella console Firebase, vai a Sicurezza > Autenticazione.
  2. Nella scheda Metodo di accesso, attiva il provider di accesso Apple.
  3. Configura le impostazioni del provider Accedi con Apple:
    • Apple: se esegui il deployment dell'app solo su piattaforme Apple puoi lasciare vuoti i campi ID servizio, ID team Apple, chiave privata e ID chiave.
    • Android: completa i passaggi seguenti per supportare i dispositivi Android:
      1. Aggiungi Firebase al tuo progetto Android.
      2. Specifica l'impronta SHA-1 della tua app, se non l'hai già fatto.
        1. Nella console Firebase, vai alla scheda Impostazioni > Generale.
        2. Scorri verso il basso fino alla scheda Le tue app , seleziona la tua app per Android e aggiungi l'impronta SHA-1 nel campo Impronte dei certificati SHA.

        Per informazioni dettagliate su come ottenere l'impronta SHA della tua app, consulta Autenticare il client.

      3. Configura le impostazioni del provider Accedi con Apple:
        1. Nella console Firebase, vai a Sicurezza > Autenticazione.
        2. Nella scheda Metodo di accesso, fai clic sul provider di accesso Apple.
        3. Specifica l'ID servizio che hai creato nella sezione precedente. Inoltre, nella sezione di configurazione del flusso di codice OAuth, specifica l'ID team Apple, la chiave privata e l'ID chiave che hai creato nella sezione precedente.

Rispetta i requisiti dei dati anonimizzati di Apple

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

Ciò include l'ottenimento del consenso dell'utente richiesto prima di associare informazioni personali che identificano direttamente l'utente a un ID Apple anonimizzato. Quando utilizzi Firebase Authentication, potresti dover eseguire le seguenti azioni:

  • Collegare un indirizzo email a un ID Apple anonimizzato 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 anonimizzato o viceversa.

L'elenco sopra riportato non è esaustivo. Per assicurarti che la tua app soddisfi i requisiti di Apple, consulta il Contratto di licenza del programma per sviluppatori Apple nella sezione Abbonamento del tuo account sviluppatore.

Accedi alla classe 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;

Gestisci 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 nonce e token di accesso Apple, ad esempio il pacchetto di archiviazione degli asset di accesso con Apple di Unity. Potresti dover modificare il codice per inserire la stringa nonce casuale generata nel suo stato di stringa non elaborata per l'utilizzo nelle operazioni Firebase (ovvero, memorizzarne una copia prima che venga creata la forma di digest SHA256 del nonce).

  2. Utilizza la stringa del token e il nonce non elaborato risultanti per creare una credenziale Firebase e accedere 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. Lo stesso pattern può essere utilizzato con ReauthenticateAsync, che può essere utilizzato per recuperare nuove credenziali per le operazioni sensibili che richiedono un accesso recente. Per saperne di più, vedi Gestire gli utenti.

  4. Quando esegui il collegamento con Accedi con Apple sulle piattaforme Apple, potresti riscontrare un errore che indica che un account Firebase esistente è già stato collegato all'account Apple. In questo caso, verrà generata un'eccezione Firebase.Auth.FirebaseAccountLinkException anziché la 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 evita la necessità di generare un nuovo token Accedi con Apple con 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, autentica gli utenti con Firebase integrando l'accesso OAuth generico basato sul web nella tua app utilizzando l'SDK Firebase per eseguire il flusso di accesso end-to-end.

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

  1. Crea un'istanza di FederatedOAuthProviderData configurata con l'ID provider appropriato per Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Facoltativo:specifica ambiti OAuth 2.0 aggiuntivi oltre 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. Per le impostazioni internazionali supportate, consulta la documentazione di Accedi con Apple.

    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 del provider di autenticazione. Tieni presente che, a differenza di altre operazioni FirebaseAuth, questa operazione prenderà il controllo dell'interfaccia utente visualizzando 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. Lo stesso pattern può essere utilizzato con ReauthenticateWithProvider, che può essere utilizzato per recuperare nuove credenziali per le operazioni sensibili che richiedono un 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 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 quando l'utente ha eseguito l'accesso 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);
        });
    

Note su Accedi con Apple

A differenza di altri provider supportati da Firebase Auth, Apple non fornisce un 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 (nel formato 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 le informazioni utente, come il nome visualizzato, con le app solo la prima volta che un utente esegue l'accesso. In genere, Firebase memorizza il nome visualizzato la prima volta che un utente esegue l'accesso con Apple, che puoi ottenere con auth.CurrentUser.DisplayName. Tuttavia, se in precedenza hai utilizzato Apple per consentire a un utente di accedere all'app senza utilizzare 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 il nome utente e la password, il numero di telefono o le informazioni del provider di autenticazione con cui l'utente ha eseguito l'accesso. Questo nuovo account viene memorizzato come parte del tuo progetto Firebase e può essere utilizzato per identificare un utente in ogni app del tuo progetto, indipendentemente dalla modalità di accesso dell'utente.

Nelle tue app, puoi ottenere 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 un utente può accedere.