Uwierzytelnij przez Apple i Unity

Możesz umożliwić użytkownikom uwierzytelnianie się w Firebase za pomocą identyfikatora Apple ID, korzystając z pakietu SDK Firebase do przeprowadzenia pełnego procesu logowania OAuth 2.0.

Zanim zaczniesz

Aby umożliwić użytkownikom logowanie się za pomocą Apple, najpierw skonfiguruj funkcję Zaloguj się przez Apple w witrynie dla deweloperów Apple, a potem włącz Apple jako dostawcę logowania w projekcie w Firebase.

Dołącz do programu Apple Developer Program

Funkcję Zaloguj się przez Apple mogą konfigurować tylko członkowie programu Apple Developer Program.

Skonfiguruj funkcję Zaloguj się przez Apple

Funkcja Zaloguj się przez Apple musi być włączona i prawidłowo skonfigurowana w projekcie w Firebase. Konfiguracja dewelopera Apple różni się w zależności od platformy Android i Apple. Zanim przejdziesz dalej, wykonaj czynności opisane w sekcji „Konfigurowanie funkcji Zaloguj się przez Apple” w przewodnikach dla iOS+ lub Androida.

Włącz Apple jako dostawcę logowania

  1. W konsoli Firebase otwórz Zabezpieczenia > Uwierzytelnianie.
  2. Na karcie Metoda logowania włącz dostawcę logowania Apple.
  3. Skonfiguruj ustawienia dostawcy logowania Apple:
    • Apple: jeśli wdrażasz aplikację tylko na platformach Apple, możesz pozostawić puste pola Identyfikator usługi, Identyfikator zespołu Apple, Klucz prywatny i Identyfikator klucza.
    • Android: aby obsługiwać urządzenia z Androidem, wykonaj te czynności:
      1. Dodaj Firebase do projektu aplikacji na Androida.
      2. Jeśli jeszcze tego nie zrobisz, określ odcisk cyfrowy SHA-1 aplikacji.
        1. W konsoli Firebase otwórz kartę Ustawienia > Ogólne tab.
        2. Przewiń w dół do karty Twoje aplikacje , wybierz aplikację na Androida i dodaj odcisk cyfrowy SHA-1 w polu Odciski cyfrowe certyfikatu SHA.

        Więcej informacji o tym, jak uzyskać odcisk cyfrowy SHA aplikacji, znajdziesz w artykule Uwierzytelnianie klienta.

      3. Skonfiguruj ustawienia dostawcy logowania Apple:
        1. W konsoli Firebase otwórz Zabezpieczenia > Uwierzytelnianie.
        2. Na karcie Metoda logowania kliknij dostawcę logowania Apple.
        3. Określ identyfikator usługi utworzony w poprzedniej sekcji. W sekcji konfiguracji przepływu kodu OAuth określ też identyfikator zespołu Apple oraz klucz prywatny i identyfikator klucza utworzone w poprzedniej sekcji.

Spełnij wymagania Apple dotyczące anonimizacji danych

Funkcja Zaloguj się przez Apple umożliwia użytkownikom anonimizację danych, w tym adresu e-mail, podczas logowania. Użytkownicy, którzy wybiorą tę opcję, będą mieli adresy e-mail z domeną privaterelay.appleid.com. Gdy używasz funkcji Zaloguj się przez Apple w swojej aplikacji, musisz przestrzegać wszystkich obowiązujących zasad i warunków dla deweloperów Apple dotyczących tych anonimowych identyfikatorów Apple ID.

Obejmuje to uzyskanie wymaganej zgody użytkownika przed powiązaniem bezpośrednio identyfikujących danych osobowych z anonimowym identyfikatorem Apple ID. W przypadku korzystania z uwierzytelniania Firebase może to obejmować te działania:

  • Powiązanie adresu e-mail z anonimowym identyfikatorem Apple ID lub odwrotnie.
  • Powiązanie numeru telefonu z anonimowym identyfikatorem Apple ID lub odwrotnie.
  • Powiązanie nieanonimowych danych logowania w mediach społecznościowych (Facebook, Google itp.) z anonimowym identyfikatorem Apple ID lub odwrotnie.

Powyższa lista nie jest wyczerpująca. Aby mieć pewność, że Twoja aplikacja spełnia wymagania Apple, zapoznaj się z Umową licencyjną programu Apple Developer Program w sekcji Członkostwo na koncie dewelopera, aby mieć pewność, że Twoja aplikacja spełnia wymagania Apple.

Dostęp do zajęć Firebase.Auth.FirebaseAuth

Klasa FirebaseAuth jest bramą do wszystkich wywołań interfejsu API. Jest dostępna przez FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Obsługa procesu logowania za pomocą pakietu SDK Firebase

Proces logowania za pomocą Apple różni się w zależności od platformy Apple i Android.

Na platformach Apple

  1. Zainstaluj wtyczkę innej firmy, która będzie obsługiwać generowanie nonce i tokena logowania Apple , np. pakiet Sign In With Apple Asset Storage Package firmy Unity. Może być konieczne zmodyfikowanie kodu, aby przekazać wygenerowany losowy ciąg nonce w jego pierwotnej postaci do użycia w operacjach Firebase (czyli zapisać jego kopię przed utworzeniem skrótu SHA256).

  2. Użyj wynikowego ciągu tokena i pierwotnej liczby jednorazowej, aby utworzyć dane logowania Firebase i zalogować się w 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. Ten sam wzorzec można stosować z funkcją ReauthenticateAsync, która umożliwia pobieranie nowych danych logowania do operacji wymagających niedawnego logowania. Więcej informacji znajdziesz w artykule Zarządzanie kontami użytkowników.

  4. Podczas łączenia z funkcją Zaloguj się przez Apple na platformach Apple może wystąpić błąd informujący, że istniejące konto Firebase jest już połączone z kontem Apple. W takim przypadku zamiast standardowego Firebase.FirebaseException zostanie zgłoszony wyjątek Firebase.Auth.FirebaseAccountLinkException. W takim przypadku wyjątek zawiera właściwość UserInfo.UpdatedCredential, która, jeśli jest prawidłowa, może służyć do logowania użytkownika połączonego z Apple za pomocą funkcji FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. Zaktualizowane dane logowania eliminują konieczność generowania nowego tokena logowania Apple z liczbą jednorazową na potrzeby operacji logowania.

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

W Androidzie

W Androidzie uwierzytelniaj użytkowników w Firebase, integrując w aplikacji ogólne logowanie OAuth oparte na internecie za pomocą pakietu SDK Firebase, aby przeprowadzić pełny proces logowania.

Aby obsługiwać proces logowania za pomocą pakietu SDK Firebase, wykonaj te czynności:

  1. Utwórz instancję klasy FederatedOAuthProviderData skonfigurowaną z identyfikatorem dostawcy odpowiednim dla Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Opcjonalnie: określ dodatkowe zakresy protokołu OAuth 2.0 poza domyślnymi, o które chcesz poprosić dostawcę uwierzytelniania.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. Opcjonalnie: jeśli chcesz wyświetlać ekran logowania Apple w innym języku niż angielski, ustaw parametr locale. Obsługiwane ustawienia regionalne znajdziesz w dokumentacji funkcji Zaloguj się przez Apple.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. Gdy dane dostawcy zostaną skonfigurowane, użyj ich do utworzenia FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Uwierzytelnij się w Firebase za pomocą obiektu dostawcy Uwierzytelniania. Pamiętaj, że w przeciwieństwie do innych operacji FirebaseAuth ta operacja przejmie kontrolę nad interfejsem użytkownika, wyświetlając widok internetowy, w którym użytkownik może wpisać swoje dane logowania.

    Aby rozpocząć proces logowania, wywołaj funkcję 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. Ten sam wzorzec można stosować z funkcją ReauthenticateWithProvider, która umożliwia pobieranie nowych danych logowania do operacji wymagających niedawnego logowania.

    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. Możesz też użyć funkcji LinkWithCredentialAsync(), aby połączyć różnych dostawców tożsamości z istniejącymi kontami.

    Pamiętaj, że Apple wymaga uzyskania wyraźnej zgody użytkowników przed połączeniem ich kont Apple z innymi danymi.

    Aby na przykład połączyć konto na Facebooku z bieżącym kontem Firebase, użyj tokena dostępu uzyskanego podczas logowania użytkownika na Facebooku:

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

Uwagi dotyczące logowania przez Apple

W przeciwieństwie do innych dostawców obsługiwanych przez Uwierzytelnianie Firebase Apple nie udostępnia adresu URL zdjęcia.

Gdy użytkownik zdecyduje się nie udostępniać swojego adresu e-mail aplikacji, Apple udostępni mu unikalny adres e-mail (w formacie xyz@privaterelay.appleid.com), który udostępni Twojej aplikacji. Jeśli skonfigurujesz usługę przekazywania prywatnych wiadomości e-mail, Apple będzie przekazywać e-maile wysyłane na anonimowy adres na prawdziwy adres e-mail użytkownika.

Apple udostępnia aplikacjom informacje o użytkownikach, takie jak nazwa wyświetlana, tylko przy pierwszym logowaniu. Zwykle Firebase zapisuje nazwę wyświetlaną przy pierwszym logowaniu użytkownika za pomocą Apple, którą możesz uzyskać za pomocą auth.CurrentUser.DisplayName. Jeśli jednak wcześniej logowałeś użytkownika w aplikacji za pomocą Apple bez użycia Firebase, Apple nie udostępni Firebase nazwy wyświetlanej użytkownika.

Dalsze kroki

Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania (czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania), za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane w projekcie w Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od sposobu logowania.

W aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu Firebase.Auth.FirebaseUser. Zobacz Zarządzanie kontami użytkowników.

W regułach bezpieczeństwa bazy danych czasu rzeczywistego Firebase i Cloud Storage możesz uzyskać unikalny identyfikator użytkownika zalogowanego za pomocą zmiennej auth i użyć go do kontrolowania, do jakich danych użytkownik może mieć dostęp.