您可以使用 Firebase SDK 執行端到端 OAuth 2.0 登錄流程,讓用戶使用其 Apple ID 通過 Firebase 進行身份驗證。
在你開始之前
要使用 Apple 登錄用戶,請首先在 Apple 開發者網站上配置 Sign In with Apple,然後啟用 Apple 作為 Firebase 項目的登錄提供商。
加入蘋果開發者計劃
“使用 Apple 登錄”只能由Apple 開發者計劃的成員進行配置。
配置使用 Apple 登錄
必須在您的 Firebase 項目中啟用並正確配置 Apple Sign In。 Apple Developer 配置因 Android 和 Apple 平台而異。請先按照iOS+和/或Android指南的“配置使用 Apple 登錄”部分進行操作,然後再繼續。啟用 Apple 作為登錄提供商
- 在Firebase 控制台中,打開“身份驗證”部分。在“登錄方法”選項卡上,啟用Apple提供商。
- 配置 Apple 登錄提供商設置:
- 如果您僅在 Apple 平台上部署應用程序,則可以將服務 ID、Apple 團隊 ID、私鑰和密鑰 ID 字段留空。
- 對於 Android 設備的支持:
- 將 Firebase 添加到您的 Android 項目。在 Firebase 控制台中設置應用時,請務必註冊應用的 SHA-1 簽名。
- 在Firebase 控制台中,打開“身份驗證”部分。在“登錄方法”選項卡上,啟用Apple提供商。指定您在上一部分中創建的服務 ID。此外,在 OAuth 代碼流配置部分中,指定您的 Apple 團隊 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 的過程因 Apple 和 Android 平台而異。
在蘋果平台上
安裝第三方插件來處理 Apple 登錄隨機數和令牌生成,例如Unity 的 Sign In With Apple Asset Storage Package 。您可能需要更改代碼,以在原始字符串狀態下檢測生成的隨機數字符串,以便在 Firebase 操作中使用(即,在創建隨機數的 SHA256 摘要形式之前存儲其副本)。
使用生成的令牌字符串和原始隨機數構建 Firebase 憑據並登錄 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); });
相同的模式可用於
ReauthenticateAsync
,它可用於檢索需要最近登錄的敏感操作的新憑據。有關詳細信息,請參閱管理用戶。在 Apple 平台上鍊接 Apple Sign In 時,您可能會遇到錯誤,提示現有 Firebase 帳戶已鏈接到 Apple 帳戶。發生這種情況時,將拋出
Firebase.Auth.FirebaseAccountLinkException
而不是標準的Firebase.FirebaseException
。在這種情況下,異常包括UserInfo.UpdatedCredential
屬性,如果有效,則可用於通過FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync
登錄 Apple 鏈接的用戶。更新後的憑據無需為登錄操作生成帶有隨機數的新 Apple 登錄令牌。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 } } });
在安卓上
在 Android 上,使用 Firebase SDK 將基於 Web 的通用 OAuth 登錄集成到您的應用中,以執行端到端登錄流程,從而通過 Firebase 對您的用戶進行身份驗證。
要使用 Firebase SDK 處理登錄流程,請按照以下步驟操作:
構造一個
FederatedOAuthProviderData
實例,並配置適合 Apple 的提供程序 ID。Firebase.Auth.FederatedOAuthProviderData providerData = new Firebase.Auth.FederatedOAuthProviderData(); providerData.ProviderId = "apple.com";
可選:指定您想要從身份驗證提供程序請求的默認範圍之外的其他 OAuth 2.0 範圍。
providerData.Scopes = new List<string>(); providerData.Scopes.Add("email"); providerData.Scopes.Add("name");
可選:如果您想以英語以外的語言顯示 Apple 的登錄屏幕,請設置
locale
參數。請參閱“使用 Apple 登錄”文檔了解支持的區域設置。providerData.CustomParameters = new Dictionary<string,string>; // Localize to French. providerData.CustomParameters.Add("language", "fr");
配置提供程序數據後,使用它來創建 FederatedOAuthProvider。
// Construct a FederatedOAuthProvider for use in Auth methods. Firebase.Auth.FederatedOAuthProvider provider = new Firebase.Auth.FederatedOAuthProvider(); provider.SetProviderData(providerData);
使用身份驗證提供程序對象通過 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.AuthResult authResult = task.Result; Firebase.Auth.FirebaseUser user = authResult.User; Debug.LogFormat("User signed in successfully: {0} ({1})", user.DisplayName, user.UserId); });
相同的模式可以與
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.AuthResult authResult = task.Result; Firebase.Auth.FirebaseUser user = authResult.User; Debug.LogFormat("User reauthenticated successfully: {0} ({1})", user.DisplayName, user.UserId); });
而且,您可以使用
LinkWithCredentialAsync()
將不同的身份提供商鏈接到現有帳戶。請注意,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.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); });
使用 Apple Notes 登錄
與 Firebase Auth 支持的其他提供商不同,Apple 不提供照片 URL。
此外,當用戶選擇不與應用程序共享其電子郵件時,Apple 會為該用戶提供一個唯一的電子郵件地址(格式為xyz@privaterelay.appleid.com
),並與您的應用程序共享。如果您配置了私人電子郵件轉發服務,Apple 會將發送到匿名地址的電子郵件轉發到用戶的真實電子郵件地址。
Apple 僅在用戶首次登錄時與應用共享用戶信息,例如顯示名稱。通常,Firebase 會在用戶首次登錄 Apple 時存儲顯示名稱,您可以通過auth.CurrentUser.DisplayName
獲取該顯示名稱。但是,如果您之前使用 Apple 將用戶登錄到應用程序而不使用 Firebase,則 Apple 不會向 Firebase 提供用戶的顯示名稱。
下一步
用戶首次登錄後,系統會創建一個新的用戶帳戶,並將其鏈接到用戶登錄時使用的憑據(即用戶名和密碼、電話號碼或身份驗證提供商信息)。此新帳戶將作為 Firebase 項目的一部分存儲,並且可用於識別項目中每個應用中的用戶,無論用戶如何登錄。在您的應用中,您可以從 Firebase.Auth.FirebaseUser 對象獲取用戶的基本個人資料信息。請參閱管理用戶。
在 Firebase 實時數據庫和雲存儲安全規則中,您可以從 auth 變量獲取登錄用戶的唯一用戶 ID,並使用它來控制用戶可以訪問哪些數據。