您可以透過 Firebase Authentication 將簡訊傳送至使用者的手機,讓使用者登入。使用者透過簡訊中的一次性代碼登入。
本文說明如何使用 Firebase SDK 導入手機號碼登入流程。
事前準備
-
如要使用 Firebase Authentication,請先將 Firebase Unity SDK (具體來說是
FirebaseAuth.unitypackage
) 新增至 Unity 專案。如需這些初始設定步驟的詳細操作說明,請參閱「將 Firebase 新增至您的 Unity 專案」一文。
- 如果尚未將應用程式連結至 Firebase 專案,請從 Firebase 控制台進行連結。
- 瞭解電話號碼登入的平台需求條件:
- 電話號碼登入僅適用於行動平台。
- 在 iOS 裝置上,電話號碼登入功能需要實體裝置,無法在模擬器上運作。
安全疑慮
僅使用電話號碼驗證雖然方便,但安全性不如其他可用方法,因為電話號碼很容易在使用者之間轉移。此外,如果裝置有多個使用者設定檔,任何可接收簡訊的使用者都能使用裝置的電話號碼登入帳戶。
如果應用程式採用電話號碼登入方式,請一併提供更安全的登入方式,並告知使用者使用電話號碼登入的安全性考量。
為 Firebase 專案啟用電話號碼登入功能
如要透過簡訊登入使用者,請先為 Firebase 專案啟用電話號碼登入方法:
- 在 Firebase 控制台中,開啟「驗證」部分。
- 在「登入方式」頁面中,啟用「電話號碼」登入方式。
- 選用:在「設定」頁面中,針對要允許或拒絕傳送簡訊的區域設定政策。設定簡訊區域政策有助於保護應用程式,防範簡訊濫用行為。
開始接收 APNs 通知 (僅限 iOS)
如要在 iOS 上使用電話號碼驗證功能,應用程式必須能夠接收來自 Firebase 的 APNs 通知。使用者首次在裝置上使用電話號碼登入時,Firebase Authentication 會傳送無聲推播通知到該裝置,驗證電話號碼登入要求是否來自您的應用程式 (因此,電話號碼登入功能無法在模擬器上使用)。
如要啟用 APNs 通知,以便搭配 Firebase Authentication 使用,請按照下列步驟操作:
- 在 Xcode 中,為專案 啟用推播通知。
將 APNs 憑證上傳至 Firebase。 如果沒有 APNs 憑證,請務必在 Apple 開發人員會員中心建立憑證。
-
在 Firebase 控制台的專案中,依序選取齒輪圖示、「專案設定」和「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,並在應用程式載入時還原。這麼做可確保在使用者完成登入流程前 (例如切換至簡訊應用程式時),應用程式終止時仍有有效的驗證 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 安全規則中,您可以從
auth
變數取得已登入使用者的專屬使用者 ID, 並使用該 ID 控制使用者可存取的資料。
您可以將驗證供應商憑證連結至現有使用者帳戶,允許使用者透過多個驗證供應商登入應用程式。
如要登出使用者,請呼叫
SignOut()
:
auth.SignOut();