您可以使用 Firebase 身份驗證通過向用戶的手機發送短信來登錄用戶。用戶使用 SMS 消息中包含的一次性代碼登錄。
本文檔介紹瞭如何使用 Firebase SDK 實現電話號碼登錄流程。
在你開始之前
在使用Firebase Authentication之前,您需要將Firebase Unity SDK (特別是
FirebaseAuth.unitypackage
)添加到您的 Unity 項目中。在將 Firebase 添加到您的 Unity 項目中找到有關這些初始設置步驟的詳細說明。
- 如果您尚未將您的應用程序連接到您的 Firebase 項目,請從Firebase 控制台執行此操作。
- 了解電話號碼登錄的平台要求:
- 電話號碼登錄僅適用於移動平台。
- 在 iOS 上,電話號碼登錄需要物理設備,無法在模擬器上使用。
安全問題
僅使用電話號碼進行身份驗證雖然方便,但不如其他可用方法安全,因為電話號碼的所有權可以在用戶之間輕鬆轉移。此外,在具有多個用戶配置文件的設備上,任何可以接收 SMS 消息的用戶都可以使用設備的電話號碼登錄帳戶。
如果您在您的應用中使用基於電話號碼的登錄,您應該將其與更安全的登錄方法一起提供,並告知用戶使用電話號碼登錄的安全權衡。
為您的 Firebase 項目啟用電話號碼登錄
要通過短信登錄用戶,您必須首先為您的 Firebase 項目啟用電話號碼登錄方法:
- 在Firebase 控制台中,打開身份驗證部分。
- 在登錄方法頁面上,啟用電話號碼登錄方法。
Firebase 的電話號碼登錄請求配額足夠高,大多數應用不會受到影響。但是,如果您需要使用電話身份驗證登錄大量用戶,則可能需要升級您的定價計劃。請參閱定價頁面。
開始接收 APNs 通知(僅限 iOS)
要在 iOS 上使用電話號碼身份驗證,您的應用必須能夠從 Firebase 接收 APNs 通知。當您首次在設備上使用電話號碼登錄用戶時,Firebase 身份驗證會向設備發送靜默推送通知,以驗證電話號碼登錄請求是否來自您的應用。 (因此,不能在模擬器上使用電話號碼登錄。)
要啟用 APNs 通知以用於 Firebase 身份驗證:
- 在 Xcode 中,為您的項目啟用推送通知。
將您的 APNs 證書上傳到 Firebase。如果您還沒有 APNs 證書,請確保在Apple Developer Member Center中創建一個。
在 Firebase 控制台的項目內,選擇齒輪圖標,選擇Project Settings ,然後選擇Cloud Messaging選項卡。
為您的開發證書、生產證書或兩者選擇上傳證書按鈕。至少需要一個。
對於每個證書,選擇 .p12 文件,並提供密碼(如果有)。確保此證書的捆綁包 ID 與您的應用程序的捆綁包 ID 匹配。選擇保存。
發送驗證碼到用戶手機
要啟動電話號碼登錄,請向用戶顯示一個提示他們提供電話號碼的界面,然後調用PhoneAuthProvider.VerifyPhoneNumber
以請求 Firebase 通過短信向用戶的電話發送驗證碼:
獲取用戶的電話號碼。
法律要求各不相同,但作為最佳實踐並為您的用戶設定期望,您應該告知他們,如果他們使用手機登錄,他們可能會收到一條短信進行驗證,並適用標準費率。
- 調用
PhoneAuthProvider.VerifyPhoneNumber
,將包含用戶電話號碼的 PhoneAuthOptions 傳遞給它。PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth); provider.VerifyPhoneNumber( new Firebase.Auth.PhoneAuthOptions { PhoneNumber = phoneNumber, TimeoutInMilliseconds = phoneAuthTimeoutMs, ForceResendingToken = null }, verificationCompleted: (credential) => { // Auto-sms-retrieval or instant validation has succeeded (Android only). // There is no need to input the verification code. // `credential` can be used instead of calling GetCredential(). }, verificationFailed: (error) => { // The verification code was not sent. // `error` contains a human readable explanation of the problem. }, codeSent: (id, token) => { // Verification code was successfully sent via SMS. // `id` contains the verification id that will need to passed in with // the code from the user when calling GetCredential(). // `token` can be used if the user requests the code be sent again, to // tie the two requests together. }, codeAutoRetrievalTimeout: (id) => { // Called when the auto-sms-retrieval has timed out, based on the given // timeout parameter. // `id` contains the verification id of the request that timed out. });
當您致電PhoneAuthProvider.VerifyPhoneNumber
時,Firebase,- (在 iOS 上),向您的應用發送靜默推送通知。
- Firebase 向指定的電話號碼發送一條包含身份驗證代碼的短信,並將驗證 ID 傳遞給您的完成功能。您將需要驗證碼和驗證 ID 才能登錄用戶。
保存驗證 ID 並在您的應用加載時恢復它。通過這樣做,如果您的應用程序在用戶完成登錄流程之前終止(例如,切換到 SMS 應用程序時),您可以確保您仍然擁有有效的驗證 ID。
您可以以任何方式保留驗證 ID。一種簡單的方法是使用
UnityEngine.PlayerPrefs
保存驗證 ID。
如果調用傳遞給codeSent
回調,您可以在用戶收到短信時提示用戶輸入驗證碼。
另一方面,如果調用verificationCompleted
的回調,則自動驗證已成功,您現在將擁有一個PhoneAuthCredential
,您可以按如下所述使用它。
使用驗證碼登錄用戶
在用戶向您的應用程序提供短信中的驗證碼後,通過從驗證碼和驗證 ID 創建PhoneAuthCredential
對象並將該對像傳遞給FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync
來讓用戶登錄。
- 獲取用戶的驗證碼。
- 從驗證碼和驗證 ID 創建一個
Credential
對象。PhoneAuthCredential credential = phoneAuthProvider.GetCredential(verificationId, verificationCode);
- 使用
PhoneAuthCredential
對象登錄用戶:auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => { if (task.IsFaulted) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception); return; } FirebaseUser newUser = task.Result.User; Debug.Log("User signed in successfully"); // This should display the phone number. Debug.Log("Phone number: " + newUser.PhoneNumber); // The phone number providerID is 'phone'. Debug.Log("Phone provider ID: " + newUser.ProviderId); });
下一步
用戶首次登錄後,將創建一個新的用戶帳戶並將其鏈接到用戶登錄所用的憑據,即用戶名和密碼、電話號碼或身份驗證提供商信息。這個新帳戶存儲為您的 Firebase 項目的一部分,可用於在項目中的每個應用程序中識別用戶,無論用戶如何登錄。
在您的應用中,您可以從
Firebase.Auth.FirebaseUser
對象獲取用戶的基本個人資料信息:Firebase.Auth.FirebaseUser user = auth.CurrentUser; if (user != null) { string name = user.DisplayName; string email = user.Email; System.Uri photo_url = user.PhotoUrl; // The user's Id, unique to the Firebase project. // Do NOT use this value to authenticate with your backend server, if you // have one; use User.TokenAsync() instead. string uid = user.UserId; }
在您的 Firebase Realtime Database 和 Cloud Storage Security Rules中,您可以從
auth
變量中獲取登錄用戶的唯一用戶 ID,並使用它來控制用戶可以訪問的數據。
您可以允許用戶使用多個身份驗證提供程序登錄您的應用程序,方法是將身份驗證提供程序憑據鏈接到現有用戶帳戶。
要註銷用戶,請調用SignOut()
:
auth.SignOut();