Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

使用Apple和Unity進行身份驗證

您可以使用Firebase SDK來執行端到端OAuth 2.0登錄流程,從而讓用戶使用其Apple ID通過Firebase進行身份驗證。

在你開始之前

要使用Apple登錄用戶,請首先在Apple的開發人員站點上配置“使用Apple登錄”,然後將Apple啟用為Firebase項目的登錄提供程序。

加入蘋果開發者計劃

使用Apple登錄只能由Apple Developer Program成員配置。

使用Apple配置登錄

必須在Firebase項目中啟用並正確配置Apple登錄。 Apple Developer配置在Android和iOS平台上有所不同。在繼續之前,請先遵循iOS和/或Android指南中的“使用Apple配置登錄”部分。

使Apple成為登錄提供商

  1. Firebase控制台中,打開“身份驗證”部分。在“登錄方法”選項卡上,啟用Apple提供程序。
  2. 配置Apple登錄提供程序設置:
    1. 如果僅在iOS上部署應用程序,則可以將服務ID,Apple Team ID,私鑰和密鑰ID字段保留為空。
    2. 對於Android設備上的支持:
      1. 將Firebase添加到您的Android項目。在Firebase控制台中設置應用程序時,請確保註冊應用程序的SHA-1簽名。
      2. Firebase控制台中,打開“身份驗證”部分。在“登錄方法”選項卡上,啟用Apple提供程序。指定您在上一節中創建的服務ID。另外,在OAuth代碼流配置部分中,指定您的Apple Team ID以及您在上一部分中創建的私鑰和密鑰ID。

符合Apple匿名數據要求

使用Apple登錄可以為用戶提供在登錄時匿名化其數據(包括其電子郵件地址)的選項。選擇此選項的用戶的電子郵件地址的域為privaterelay.appleid.com 。當您在應用中使用“通過Apple登錄”時,您必須遵守Apple關於這些匿名Apple ID的所有適用開發人員政策或條款。

這包括在將任何直接識別的個人信息與匿名的Apple ID相關聯之前,獲得所有必需的用戶同意。使用Firebase身份驗證時,這可能包括以下操作:

  • 將電子郵件地址鏈接到匿名的Apple ID,反之亦然。
  • 將電話號碼鏈接到匿名的Apple ID,反之亦然
  • 將非匿名社交憑據(Facebook,Google等)鏈接到匿名Apple ID,反之亦然。

上面的列表並不詳盡。請參閱開發人員帳戶的“成員資格”部分中的“ Apple開發人員計劃許可協議”,以確保您的應用程序滿足Apple的要求。

訪問Firebase.Auth.FirebaseAuth

FirebaseAuth類是所有API調用的網關。可通過FirebaseAuth.DefaultInstance訪問它。
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

使用Firebase SDK處理登錄流程

使用Apple登錄的過程在iOS和Android平台上有所不同。

在iOS上

  1. 安裝第三方插件來處理Apple登錄隨機數和令牌生成,例如Unity的“使用Apple Asset Storage Package登錄” 。您可能需要更改代碼以將生成的隨機隨機數字符串以其原始字符串狀態垂直以用於Firebase操作(也就是說,在創建隨機數的SHA256摘要形式之前存儲其副本)。

  2. 使用生成的令牌字符串和原始隨機數來構建Firebase憑據並登錄到Firebase。

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

  3. 可以將同一模式與ReauthenticateAsync一起使用,該模式可以用於檢索需要最近登錄的敏感操作的新憑據。有關更多信息,請參見管理用戶

  4. 在iOS上與Apple Sign In鏈接時,您可能會遇到一個錯誤,即現有的Firebase帳戶已鏈接到Apple帳戶。發生這種情況時,將拋出Firebase.Auth.FirebaseAccountLinkException而不是標準的Firebase.FirebsaeException 。異常包括UserInfo.UpdatedCredential屬性,如果有效,該屬性可用於通過FirebaseAuth.SignInWithCredential登錄與Apple鏈接的用戶。更新後的憑據避免了需要為登錄操作生成帶有隨機數的新Apple Sign-In令牌。

    請注意, LinkWithCredentialAsync將在鏈接失敗時繼續引發標準Firebase.FirebaseException ,因此無法返回更新的憑據。

    auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompleted) {
            // 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.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( signInTask => {
                      // Handle Sign in result.
                    });
                } else {
                  DebugLog("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

在Android上

在Android上,通過使用Firebase SDK將基於Web的通用OAuth登錄集成到您的應用中,以使用Firebase對用戶進行身份驗證,以執行端到端登錄流程。

要使用Firebase SDK處理登錄流程,請按照以下步驟操作:

  1. 構造一個FederatedOAuthProviderData的實例,該實例配置有適用於Apple的提供者ID。

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. 可選:指定其他OAuth 2.0範圍,超出您要向身份驗證提供程序請求的默認範圍。

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. 可選:如果要以英語以外的其他語言顯示Apple的登錄屏幕,請設置locale參數。有關受支持的語言環境,請參閱“ 使用Apple登錄”

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. 一旦配置了提供者數據,就可以使用它來創建FederatedOAuthProvider。

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. 使用Auth提供程序對象向Firebase進行身份驗證。請注意,與其他FirebaseAuth操作不同,這將通過彈出一個用戶可以在其中輸入其憑據的Web視圖來控制您的UI。

    要開始登錄流程,請調用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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. 可以將同一模式與ReauthenticateWithProvider一起使用,該模式可用於檢索需要最近登錄的敏感操作的新憑據。

    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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. 並且,您可以使用linkWithCredential()將不同的身份提供程序鏈接到現有帳戶。

    請注意,在將用戶的Apple帳戶鏈接到其他數據之前,Apple要求您徵得用戶的明確同意。

    例如,要將Facebook帳戶鏈接到當前的Firebase帳戶,請使用從用戶登錄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.LinkAndRetrieveDataWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.SignInResult signInResult = task.Result;
          Firebase.Auth.FirebaseUser user = signInResult.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

使用Apple Notes登錄

與Firebase Auth支持的其他提供程序不同,Apple不提供照片URL。

另外,當用戶選擇不與應用程序共享電子郵件時,Apple會為該用戶提供一個唯一的電子郵件地址(格式為xyz@privaterelay.appleid.com ),並與您的應用程序共享。如果您配置了私人電子郵件中繼服務,則Apple會將發送到匿名地址的電子郵件轉發到用戶的真實電子郵件地址。

Apple僅在用戶首次登錄時與應用共享用戶信息,例如顯示名稱。通常,Firebase存儲用戶首次登錄Apple時的顯示名稱,您可以使用getCurrentUser().getDisplayName() 。但是,如果您以前使用Apple在不使用Firebase的情況下將用戶登錄到應用程序,則Apple不會為Firebase提供用戶的顯示名稱。

下一步

用戶首次登錄後,將創建一個新的用戶帳戶並將其鏈接到該用戶登錄的憑據(即用戶名和密碼,電話號碼或身份驗證提供者信息)。此新帳戶存儲為Firebase項目的一部分,無論用戶如何登錄,都可以用來在項目中的每個應用程序中識別用戶。

在您的應用中,您可以從firebase :: auth :: user對像中獲取用戶的基本配置文件信息。請參閱管理用戶

在您的Firebase實時數據庫和雲存儲安全規則中,您可以從auth變量中獲取登錄用戶的唯一用戶ID,然後使用它來控制用戶可以訪問哪些數據。