Uwierzytelnij przez Apple i Unity

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

Zanim zaczniesz

Aby logować użytkowników przy użyciu urządzenia Apple, najpierw skonfiguruj funkcję Zaloguj się przez Apple w witrynie dla deweloperów Apple, a potem włącz Apple jako dostawcę logowania w swoim projekcie Firebase.

Dołącz do programu dla deweloperów Apple

Funkcja Zaloguj się przez Apple może skonfigurować tylko członkowie programu dla deweloperów Apple.

Skonfiguruj logowanie się przez Apple

Musisz włączyć i prawidłowo skonfigurować logowanie przez Apple w swoim projekcie Firebase. Konfiguracja Apple dla deweloperów różni się w zależności od platformy Apple i Androida. Zanim przejdziesz dalej, wykonaj czynności opisane w sekcji „Skonfiguruj logowanie się przez Apple” w przewodnikach dotyczących iOS+ lub Androida.

Włącz Apple jako dostawcę logowania

  1. W konsoli Firebase otwórz sekcję Uwierzytelnianie. Na karcie Metoda logowania włącz dostawcę Apple.
  2. Skonfiguruj ustawienia dostawcy logowania przez Apple:
    1. Jeśli wdrażasz aplikację tylko na platformach Apple, pola identyfikatora usługi, identyfikatora zespołu Apple, klucza prywatnego i identyfikatora klucza możesz pozostawić puste.
    2. Aby uzyskać pomoc dotyczącą urządzeń z Androidem:
      1. Dodaj Firebase do swojego projektu na Androida. Pamiętaj, aby podczas konfigurowania aplikacji w konsoli Firebase zarejestrować jej podpis SHA-1.
      2. W konsoli Firebase otwórz sekcję Uwierzytelnianie. Na karcie Metoda logowania włącz dostawcę Apple. Podaj identyfikator usługi utworzony w poprzedniej sekcji. Dodatkowo w sekcji konfiguracji przepływu kodu OAuth podaj identyfikator zespołu Apple oraz klucz prywatny i identyfikator klucza utworzony w poprzedniej sekcji.

Zgodność z wymaganiami firmy Apple dotyczącymi zanonimizowanych danych

Zaloguj się przez Apple umożliwia anonimizację danych, w tym adresu e-mail, podczas logowania. Użytkownicy, którzy wybiorą tę opcję, mają adresy e-mail w domenie privaterelay.appleid.com. Gdy w swojej aplikacji korzystasz z funkcji Zaloguj się przez Apple, musisz przestrzegać wszystkich obowiązujących zasad dla deweloperów i warunków firmy Apple dotyczących tych zanonimizowanych identyfikatorów Apple.

Obejmuje to uzyskanie wymaganej zgody użytkownika przed powiązaniem danych osobowych umożliwiających bezpośrednią identyfikację z anonimowym identyfikatorem Apple ID. Gdy używasz uwierzytelniania Firebase, może to wiązać się z tymi działaniami:

  • Połącz adres e-mail z anonimowym identyfikatorem Apple ID lub odwrotnie.
  • Łączenie numeru telefonu z anonimowym identyfikatorem Apple ID i odwrotnie
  • Połącz nieanonimowe dane społecznościowe (Facebook, Google itp.) z anonimowym identyfikatorem Apple lub odwrotnie.

Powyższa lista nie jest wyczerpująca. Zapoznaj się z umową licencyjną programu Apple dla deweloperów w sekcji Subskrypcja na koncie dewelopera, aby upewnić się, że Twoja aplikacja spełnia wymagania Apple.

Uzyskaj dostęp do zajęć Firebase.Auth.FirebaseAuth

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

Zarejestruj się za pomocą pakietu SDK Firebase

Proces logowania się przez Apple różni się w zależności od platformy Apple i Androida.

Na platformach Apple

  1. Zainstaluj wtyczkę innej firmy, aby obsługiwać jednorazowe logowanie Apple i generowanie tokenów, na przykład pakiet logowania Unity's Sign In with Apple Asset Storage. Konieczna może być zmiana kodu, by pobrać wygenerowany losowy ciąg jednorazowy w stanie nieprzetworzonym do wykorzystania w operacjach Firebase (to znaczy zapisać jego kopię przed utworzeniem skrótu SHA256 identyfikatora jednorazowego).

  2. Użyj powstałego ciągu tokena i nieprzetworzonej wartości jednorazowej, aby utworzyć dane uwierzytelniające Firebase i zalogować się w tej usłudze.

    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. Tego samego wzorca można używać z zasadą ReauthenticateAsync, która umożliwia pobieranie nowych danych logowania na potrzeby poufnych operacji, które wymagają niedawnego zalogowania. Więcej informacji znajdziesz w artykule Zarządzanie użytkownikami.

  4. Podczas łączenia za pomocą funkcji Apple Sign In na platformach Apple może pojawić się komunikat o błędzie informujący o tym, że istniejące konto Firebase zostało już połączone z kontem Apple. W takiej sytuacji zamiast standardowej Firebase.FirebaseException zostanie zgłoszona właściwość Firebase.Auth.FirebaseAccountLinkException. W tym przypadku wyjątek zawiera właściwość UserInfo.UpdatedCredential, której można użyć do zalogowania się użytkownika połączonego z Apple za pomocą FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. Zaktualizowane dane logowania nie wymagają generowania nowego tokena logowania Apple z wartością 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
            }
          }
        });
    

Na urządzeniu z Androidem

W przypadku Androida możesz uwierzytelniać użytkowników w Firebase, integrując internetowy interfejs logowania OAuth z wykorzystaniem pakietu SDK Firebase w celu przeprowadzenia kompleksowego procesu logowania.

Aby zalogować się za pomocą pakietu SDK Firebase, wykonaj te czynności:

  1. Utwórz instancję FederatedOAuthProviderData skonfigurowaną za pomocą identyfikatora dostawcy odpowiedniego 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 wykraczające poza domyślne, o które chcesz prosić 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 języku innym niż angielski, ustaw parametr locale. Informacje o obsługiwanych regionach znajdziesz w dokumentacji logowania 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 obiektu FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Uwierzytelniaj w Firebase za pomocą obiektu dostawcy uwierzytelniania. Pamiętaj, że w przeciwieństwie do innych operacji FirebaseAuth da to kontrolę nad interfejsem użytkownika – wyświetli się widok witryny, w którym użytkownik może wpisać swoje dane logowania.

    Aby rozpocząć procedurę logowania, zadzwoń pod numer 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. Tego samego wzorca można używać z zasadą ReauthenticateWithProvider, która umożliwia pobieranie nowych danych logowania na potrzeby poufnych operacji, które wymagają niedawnego zalogowania.

    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. Za pomocą LinkWithCredentialAsync() możesz też łączyć różnych dostawców tożsamości z istniejącymi kontami.

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

    Aby np. połączyć konto na Facebooku z bieżącym kontem Firebase, użyj tokena dostępu uzyskanego po zalogowaniu 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);
        });
    

Zaloguj się przez Apple Notes

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

Oprócz tego, gdy użytkownik zdecyduje się nie udostępniać swojego adresu e-mail aplikacji, Apple udostępnia mu unikalny adres e-mail (w formie formularza xyz@privaterelay.appleid.com), który udostępnia aplikacji. Jeśli masz skonfigurowaną prywatną usługę przekaźnika, Apple przekazuje e-maile wysyłane na anonimowy adres na rzeczywisty adres użytkownika.

Apple udostępnia aplikacjom informacje o użytkowniku, takie jak wyświetlana nazwa, tylko przy pierwszym logowaniu użytkownika. Zwykle Firebase przechowuje wyświetlaną nazwę przy pierwszym logowaniu się użytkownika w Apple. Możesz to uzyskać za pomocą auth.CurrentUser.DisplayName. Jeśli jednak zdarzyło Ci się logować użytkownika w aplikacji za pomocą usługi Apple bez użycia Firebase, Apple nie udostępni Firebase wyświetlanej nazwy użytkownika.

Dalsze kroki

Gdy użytkownik loguje się po raz pierwszy, tworzone jest nowe konto użytkownika, które jest łączone z danymi logowania (nazwa użytkownika i hasło, numer telefonu lub informacje o dostawcy uwierzytelniania). Nowe konto jest przechowywane w ramach Twojego projektu Firebase i może służyć do identyfikowania użytkowników we wszystkich aplikacjach w tym projekcie niezależnie od tego, jak użytkownik się loguje.

W swoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu Firebase.Auth.FirebaseUser. Zobacz Zarządzanie użytkownikami.

W Bazie danych czasu rzeczywistego Firebase i regułach zabezpieczeń Cloud Storage możesz uzyskać ze zmiennej uwierzytelniania unikalny identyfikator zalogowanego użytkownika i za jego pomocą kontrolować, do jakich danych użytkownik ma dostęp.