在 Unity 中使用電話號碼向 Firebase 驗證

您可以透過 Firebase Authentication 將簡訊傳送至使用者的手機,讓使用者登入。使用者透過簡訊中的一次性代碼登入。

本文說明如何使用 Firebase SDK 導入手機號碼登入流程。

事前準備

  1. 如要使用 Firebase Authentication,請先將 Firebase Unity SDK (具體來說是 FirebaseAuth.unitypackage) 新增至 Unity 專案。

    如需這些初始設定步驟的詳細操作說明,請參閱「將 Firebase 新增至您的 Unity 專案」一文。

  2. 如果尚未將應用程式連結至 Firebase 專案,請從 Firebase 控制台進行連結。
  3. 瞭解電話號碼登入的平台需求條件:
    • 電話號碼登入僅適用於行動平台。
    • 在 iOS 裝置上,電話號碼登入功能需要實體裝置,無法在模擬器上運作。

安全疑慮

僅使用電話號碼驗證雖然方便,但安全性不如其他可用方法,因為電話號碼很容易在使用者之間轉移。此外,如果裝置有多個使用者設定檔,任何可接收簡訊的使用者都能使用裝置的電話號碼登入帳戶。

如果應用程式採用電話號碼登入方式,請一併提供更安全的登入方式,並告知使用者使用電話號碼登入的安全性考量。

為 Firebase 專案啟用電話號碼登入功能

如要透過簡訊登入使用者,請先為 Firebase 專案啟用電話號碼登入方法:

  1. Firebase 控制台中,開啟「驗證」部分。
  2. 在「登入方式」頁面中,啟用「電話號碼」登入方式。
  3. 選用:在「設定」頁面中,針對要允許或拒絕傳送簡訊的區域設定政策。設定簡訊區域政策有助於保護應用程式,防範簡訊濫用行為。

開始接收 APNs 通知 (僅限 iOS)

如要在 iOS 上使用電話號碼驗證功能,應用程式必須能夠接收來自 Firebase 的 APNs 通知。使用者首次在裝置上使用電話號碼登入時,Firebase Authentication 會傳送無聲推播通知到該裝置,驗證電話號碼登入要求是否來自您的應用程式 (因此,電話號碼登入功能無法在模擬器上使用)。

如要啟用 APNs 通知,以便搭配 Firebase Authentication 使用,請按照下列步驟操作:

  1. 在 Xcode 中,為專案 啟用推播通知
  2. 將 APNs 憑證上傳至 Firebase。 如果沒有 APNs 憑證,請務必在 Apple 開發人員會員中心建立憑證。

    1. Firebase 控制台的專案中,依序選取齒輪圖示、「專案設定」和「Cloud Messaging」分頁標籤。

    2. 選取開發憑證、正式環境憑證或兩者的「上傳憑證」按鈕。至少須提供一個。

    3. 針對每個憑證選取 .p12 檔案,並提供密碼 (如有)。請確認這個憑證的軟體包 ID 與應用程式的軟體包 ID 相符。選取「儲存」

將驗證碼傳送至使用者的手機

如要啟動手機號碼登入程序,請向使用者顯示介面,提示他們提供手機號碼,然後呼叫 PhoneAuthProvider.VerifyPhoneNumber,要求 Firebase 透過簡訊將驗證碼傳送至使用者的手機:

  1. 取得使用者的電話號碼。

    法律規定因國家/地區而異,但為了提供最佳做法並讓使用者瞭解相關資訊,請告知他們如果使用手機登入,可能會收到驗證簡訊,且須支付一般簡訊費用。

  2. 呼叫 PhoneAuthProvider.VerifyPhoneNumber,並將含有使用者電話號碼的 PhoneAuthOptions 傳遞給該函式。
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) =&gt {
        // 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) =&gt {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) =&gt {
        // 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) =&gt {
        // 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,才能讓使用者登入。
  3. 儲存驗證 ID,並在應用程式載入時還原。這麼做可確保在使用者完成登入流程前 (例如切換至簡訊應用程式時),應用程式終止時仍有有效的驗證 ID。

    您可以透過任何方式保留驗證 ID。簡單的做法是使用 UnityEngine.PlayerPrefs 儲存驗證 ID。

如果系統呼叫傳遞至 codeSent 的回呼,您可以在使用者收到簡訊驗證碼時,提示他們輸入驗證碼。

另一方面,如果系統呼叫 verificationCompleted 的回呼,表示自動驗證成功,您現在可以取得 PhoneAuthCredential,並按照下文說明使用。

使用驗證碼登入使用者

使用者在簡訊中提供驗證碼給應用程式後,請從驗證碼和驗證 ID 建立 PhoneAuthCredential 物件,然後將該物件傳遞至 FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync,藉此登入使用者。

  1. 向使用者索取驗證碼。
  2. 根據驗證碼和驗證 ID 建立 Credential 物件。
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. 使用 PhoneAuthCredential 物件登入使用者:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task =&gt {
      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 DatabaseCloud Storage 安全規則中,您可以從 auth 變數取得已登入使用者的專屬使用者 ID, 並使用該 ID 控制使用者可存取的資料。

您可以將驗證供應商憑證連結至現有使用者帳戶,允許使用者透過多個驗證供應商登入應用程式。

如要登出使用者,請呼叫 SignOut()

auth.SignOut();