Autenticarsi utilizzando Apple e Unity

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

Prima di iniziare

Per accedere agli utenti che utilizzano Apple, configura innanzitutto Accedi con Apple sul sito degli sviluppatori Apple, quindi abilita Apple come provider di accesso per il tuo progetto Firebase.

Unisciti al programma per sviluppatori Apple

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

Configura l'accesso con Apple

L'accesso 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. Segui la sezione "Configura l'accesso con Apple" delle guide iOS+ e/o Android prima di procedere.

Abilita Apple come provider di accesso

  1. Nella console Firebase , apri la sezione Autenticazione . Nella scheda Metodo di accesso , abilita il provider Apple .
  2. Configura le impostazioni del provider di accesso Apple:
    1. Se distribuisci la tua app solo su piattaforme Apple, puoi lasciare vuoti i campi ID servizio, ID team Apple, chiave privata e ID chiave.
    2. Per supporto su dispositivi Android:
      1. Aggiungi Firebase al tuo progetto Android . Assicurati di registrare la firma SHA-1 della tua app quando configuri l'app nella console Firebase.
      2. Nella console Firebase , apri la sezione Autenticazione . Nella scheda Metodo di accesso , abilita il provider Apple . Specifica l'ID servizio creato nella sezione precedente. Inoltre, nella sezione di configurazione del flusso di codice OAuth, specifica il tuo ID team Apple, la chiave privata e l'ID chiave creati nella sezione precedente.

Rispettare i requisiti relativi ai dati anonimi di Apple

Accedi con Apple offre agli utenti la possibilità di rendere anonimi i propri dati, incluso il proprio indirizzo e-mail, al momento dell'accesso. Gli utenti che scelgono questa opzione hanno indirizzi e-mail con il dominio privaterelay.appleid.com . Quando utilizzi Accedi con Apple nella tua app, devi rispettare tutte le politiche o i termini per sviluppatori applicabili di Apple relativi a questi ID Apple anonimizzati.

Ciò include l'ottenimento del consenso dell'utente richiesto prima di associare qualsiasi informazione personale che possa identificare direttamente un ID Apple anonimo. Quando si utilizza l'autenticazione Firebase, ciò può includere le seguenti azioni:

  • Collega un indirizzo email a un ID Apple anonimo o viceversa.
  • Collega un numero di telefono a un ID Apple anonimo o viceversa
  • Collega una credenziale social non anonima (Facebook, Google, ecc.) a un ID Apple anonimo o viceversa.

L'elenco sopra riportato non è esaustivo. Fai riferimento al contratto di licenza del programma per sviluppatori Apple nella sezione Iscrizione del tuo account sviluppatore per assicurarti che la tua app soddisfi i requisiti Apple.

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.

Sulle piattaforme Apple

  1. Installa un plug-in di terze parti per gestire il nonce di accesso Apple e la generazione di token, come il pacchetto Accedi con Apple Asset Storage di Unity . Potrebbe essere necessario modificare il codice per riportare la stringa nonce casuale generata nel suo stato di stringa grezza da utilizzare nelle operazioni Firebase (ovvero, memorizzarne una copia prima che venga creato il formato digest SHA256 del nonce).

  2. Utilizza la stringa token risultante e il nonce non elaborato per costruire 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 modello può essere utilizzato con ReauthenticateAsync che può essere utilizzato per recuperare nuove credenziali per operazioni sensibili che richiedono un accesso recente. Per ulteriori informazioni vedere Gestisci utenti .

  4. Quando ti colleghi con Apple Sign In su piattaforme Apple potresti riscontrare un errore che indica che un account Firebase esistente è già stato collegato all'account Apple. Quando ciò si verifica, verrà lanciata una Firebase.Auth.FirebaseAccountLinkException invece della 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 . Le credenziali aggiornate evitano la necessità di generare un nuovo token di accesso 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 i tuoi 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, procedi nel seguente modo:

  1. Costruisci 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: specificare ulteriori ambiti OAuth 2.0 oltre a quello predefinito che si desidera richiedere al provider di autenticazione.

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

    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. Autenticarsi con Firebase utilizzando l'oggetto provider Auth. Tieni presente che, a differenza di altre operazioni FirebaseAuth, questo prenderà il controllo della tua interfaccia utente aprendo 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 modello può essere utilizzato con ReauthenticateWithProvider che può essere utilizzato per recuperare nuove credenziali per 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 che tu ottenga 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 ottenuto dall'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);
        });
    

Accedi con Apple Notes

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

Inoltre, quando l'utente sceglie di non condividere la propria email con l'app, Apple fornisce a quell'utente un indirizzo email univoco (nel formato xyz@privaterelay.appleid.com ), che condivide con la tua app. Se hai configurato il servizio di inoltro e-mail privato, Apple inoltra le e-mail inviate all'indirizzo anonimo al vero indirizzo e-mail dell'utente.

Apple condivide le informazioni dell'utente come il nome visualizzato con le app solo la prima volta che un utente accede. Di solito, Firebase memorizza il nome visualizzato la prima volta che un utente accede con Apple, che puoi ottenere con auth.CurrentUser.DisplayName . Tuttavia, se in precedenza hai utilizzato Apple per far accedere un utente all'app senza utilizzare Firebase, Apple non fornirà a Firebase il nome visualizzato dell'utente.

Prossimi passi

Dopo che un utente accede per la prima volta, viene creato un nuovo account utente e collegato alle credenziali, ovvero nome utente e password, numero di telefono o informazioni sul provider di autenticazione, con cui l'utente ha effettuato l'accesso. Questo nuovo account viene archiviato 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 Gestisci utenti .

Nel tuo Firebase Realtime Database e nelle regole di sicurezza Cloud Storage, puoi ottenere l'ID utente univoco dell'utente che ha effettuato l'accesso dalla variabile auth e utilizzarlo per controllare a quali dati può accedere un utente.