Catch up on everthing we announced at this year's Firebase Summit. Learn more

使用 Apple 和 Unity 進行身份驗證

通過使用 Firebase SDK 執行端到端 OAuth 2.0 登錄流程,您可以讓您的用戶使用他們的 Apple ID 向 Firebase 進行身份驗證。

在你開始之前

要使用 Apple 登錄用戶,請先在 Apple 的開發者網站上配置使用 Apple 登錄,然後啟用 Apple 作為 Firebase 項目的登錄提供程序。

加入 Apple 開發者計劃

登錄與蘋果只能由成員進行配置的蘋果開發者計劃

配置使用 Apple 登錄

必須在 Firebase 項目中啟用並正確配置 Apple 登錄。 Apple Developer 配置因 Android 和 Apple 平台而異。請按照“配置登錄隨著蘋果”一節的的iOS +和/或Android的繼續之前的指南。

啟用 Apple 作為登錄提供商

  1. 火力地堡控制台,打開驗證部分。在登錄方法選項卡,使蘋果的供應商。
  2. 配置 Apple 登錄提供商設置:
    1. 如果您僅在 Apple 平台上部署您的應用程序,您可以將服務 ID、Apple 團隊 ID、私鑰和密鑰 ID 字段留空。
    2. 對於 Android 設備的支持:
      1. 添加火力地堡到您的Android項目。在 Firebase 控制台中設置應用時,請務必註冊應用的 SHA-1 簽名。
      2. 火力地堡控制台,打開驗證部分。在登錄方法選項卡,使蘋果的供應商。指定您在上一節中創建的服務 ID。此外,在 OAuth 代碼流配置部分,指定您的 Apple Team ID 以及您在上一部分中創建的私鑰和密鑰 ID。

遵守 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調用的網關。它通過為accessable FirebaseAuth.DefaultInstance
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

使用 Firebase SDK 處理登錄流程

使用 Apple 登錄的過程因 Apple 和 Android 平台而異。

在蘋果平台上

  1. 安裝第三方插件來處理現時和令牌生成蘋果的標誌,如統一的登錄與蘋果的資產包寄存。您可能需要更改代碼,以在原始字符串狀態下檢測生成的隨機隨機數字符串,以用於 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. 在 Apple 平台上與 Apple Sign In 關聯時,您可能會遇到錯誤,指出現有 Firebase 帳戶已關聯到 Apple 帳戶。發生這種情況時一個Firebase.Auth.FirebaseAccountLinkException將被拋出而不是標準Firebase.FirebsaeException 。唯一的例外包括UserInfo.UpdatedCredential財產,如果有效,可以用來登入通過Apple聯用戶FirebaseAuth.SignInWithCredential 。更新後的憑據無需為登錄操作生成帶有 nonce 的新 Apple 登錄令牌。

    需要注意的是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 上,通過使用 Firebase SDK 將基於網絡的通用 OAuth 登錄集成到您的應用程序中來執行端到端登錄流程,從而使用 Firebase 對您的用戶進行身份驗證。

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

  1. 構造一個實例FederatedOAuthProviderData與供應商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. 可選:如果您想在英語以外的語言顯示蘋果的登錄畫面中,將locale參數。請參閱登錄與蘋果文檔的支持的語言環境。

    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。

此外,當用戶選擇不與應用程序,蘋果公司規定一個唯一的電子郵件地址的用戶(形式分享他們的電子郵件xyz@privaterelay.appleid.com ,其股您的應用程序)。如果您配置了私人電子郵件中繼服務,Apple 會將發送到匿名地址的電子郵件轉發到用戶的真實電子郵件地址。

蘋果只股票的用戶信息,如第一次的顯示名稱與應用程序在用戶的跡象。通常情況下,火力地堡商店的顯示名稱的第一次用戶登錄在與蘋果,你可以得到getCurrentUser().getDisplayName()但是,如果您之前使用 Apple 登錄用戶而不使用 Firebase,Apple 將不會向 Firebase 提供用戶的顯示名稱。

下一步

用戶首次登錄後,將創建一個新用戶帳戶並將其鏈接到用戶登錄時使用的憑據(即用戶名和密碼、電話號碼或身份驗證提供商信息)。這個新帳戶作為 Firebase 項目的一部分存儲,可用於識別項目中每個應用中的用戶,無論用戶如何登錄。

在您的應用中,您可以從 firebase::auth::user 對象獲取用戶的基本個人資料信息。請參閱管理用戶

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