您可以使用 Firebase 身份驗證通過向用戶手機發送 SMS 消息來登錄用戶。用戶使用 SMS 消息中包含的一次性代碼登錄。
本文檔介紹如何使用 Firebase SDK 實現電話號碼登錄流程。
在你開始之前
在您可以使用Firebase 身份驗證之前,您需要將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 通過 SMS 向用戶的手機發送驗證碼:
獲取用戶的電話號碼。
法律要求各不相同,但作為最佳實踐並為您的用戶設定期望,您應該告知他們,如果他們使用電話登錄,他們可能會收到一條短信進行驗證,並適用標準費率。
- 調用
PhoneAuthProvider.VerifyPhoneNumber
,將用戶的電話號碼傳遞給它。PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth); provider.VerifyPhoneNumber(phoneNumber, phoneAuthTimeoutMs, 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 向指定的電話號碼發送包含驗證碼的 SMS 消息,並將驗證 ID 傳遞給您的完成函數。您將需要驗證碼和驗證 ID 才能登錄用戶。
保存驗證 ID 並在您的應用加載時恢復它。通過這樣做,如果您的應用在用戶完成登錄流程之前終止(例如,在切換到 SMS 應用時),您可以確保您仍然擁有有效的驗證 ID。
您可以以任何方式保留驗證 ID。一種簡單的方法是使用
UnityEngine.PlayerPrefs
保存驗證 ID。
如果調用了傳入codeSent
的回調,可以在用戶收到短信時提示用戶輸入驗證碼。
另一方面,如果調用 verifyCompleted 的回調,則自動verificationCompleted
已成功,您現在將擁有一個可以使用的Credential
,如下所述。
使用驗證碼登錄用戶
在用戶向您的應用提供 SMS 消息中的驗證碼後,通過從驗證碼和驗證 ID 創建一個Credential
對象並將該對像傳遞給FirebaseAuth.SignInWithCredential
來登錄用戶。
- 從用戶那裡獲取驗證碼。
- 從驗證碼和驗證 ID 創建一個
Credential
對象。Credential credential = phoneAuthProvider.GetCredential(verificationId, verificationCode);
- 使用
Credential
對象登錄用戶:auth.SignInWithCredentialAsync(credential).ContinueWith(task => { if (task.IsFaulted) { Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception); return; } FirebaseUser newUser = task.Result; 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 實時數據庫和雲存儲安全規則中,您可以從
auth
變量中獲取登錄用戶的唯一用戶 ID,並使用它來控制用戶可以訪問哪些數據。
您可以通過將身份驗證提供程序憑據鏈接到現有用戶帳戶來允許用戶使用多個身份驗證提供程序登錄您的應用程序。
要註銷用戶,請調用SignOut()
:
auth.SignOut();