您可以使用 Firebase SDK 執行端對端 OAuth 2.0 登入流程,讓使用者透過 Apple ID 向 Firebase 驗證身分。
事前準備
如要透過 Apple 登入使用者,請先在 Apple 開發人員網站上設定「透過 Apple 登入」,然後為 Firebase 專案啟用 Apple 做為登入供應商。
加入 Apple 開發人員計畫
只有 Apple 開發人員計畫的成員可以設定「使用 Apple 帳戶登入」。
設定「使用 Apple 登入」功能
您必須在 Firebase 專案中啟用並正確設定 Apple 登入。 Android 和 Apple 平台的 Apple Developer 設定有所不同。 請先按照 iOS+ 和/或 Android 指南的「設定使用 Apple 登入」一節操作,再繼續進行後續步驟。啟用 Apple 做為登入供應商
- 在 Firebase 控制台中,開啟「Auth」(驗證) 部分。在「登入方式」分頁中,啟用「Apple」供應器。
- 設定 Apple 登入供應商設定:
- 如果只在 Apple 平台上部署應用程式,可以將服務 ID、Apple 團隊 ID、私密金鑰和金鑰 ID 欄位留空。
- Android 裝置支援:
- 將 Firebase 新增至 Android 專案。在 Firebase 控制台中設定應用程式時,請務必註冊應用程式的 SHA-1 簽章。
- 在 Firebase 控制台中,開啟「Auth」(驗證) 部分。在「Sign in method」(登入方式) 分頁中,啟用「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 平台
安裝第三方外掛程式,處理 Apple 登入隨機值和權杖產生作業,例如 Unity 的「Sign In With Apple Asset Storage Package」(使用 Apple 帳戶登入資產儲存套件)。您可能需要變更程式碼,以原始字串狀態導入產生的隨機隨機數值字串,供 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 登入」功能連結時,可能會遇到錯誤,指出現有的 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 版
在 Android 上,請使用 Firebase SDK 將網頁型一般 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);
使用 Auth 提供者物件向 Firebase 進行驗證。請注意,與其他 FirebaseAuth 作業不同,這項作業會彈出網頁檢視畫面,讓使用者輸入憑證,藉此控管您的 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 備忘錄登入
與 Firebase Auth 支援的其他供應商不同,Apple 不會提供相片網址。
此外,如果使用者選擇不與應用程式分享電子郵件地址,Apple 會為該使用者提供專屬電子郵件地址 (格式為 xyz@privaterelay.appleid.com
),並與您的應用程式共用。如果您已設定私人電子郵件轉發服務,Apple 會將傳送至匿名地址的電子郵件轉寄至使用者的實際電子郵件地址。
Apple 只會在使用者首次登入時,與應用程式分享顯示名稱等使用者資訊。通常,Firebase 會在使用者首次透過 Apple 登入時儲存顯示名稱,您可以透過 auth.CurrentUser.DisplayName
取得該名稱。不過,如果您先前使用 Apple 登入應用程式,但沒有使用 Firebase,Apple 就不會提供使用者的顯示名稱給 Firebase。
後續步驟
使用者首次登入後,系統會建立新的使用者帳戶,並連結使用者登入時使用的憑證 (即使用者名稱和密碼、電話號碼或驗證供應商資訊)。這個新帳戶會儲存在 Firebase 專案中,可用於識別專案中每個應用程式的使用者,無論使用者登入方式為何。在應用程式中,您可以從 Firebase.Auth.FirebaseUser 物件取得使用者的基本個人資料資訊。請參閱「管理使用者」。
在 Firebase 即時資料庫和 Cloud Storage 安全性規則中,您可以從 auth 變數取得登入使用者的專屬使用者 ID,並用來控管使用者可存取的資料。