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

您可以使用 Firebase Authentication 傳送簡訊來登入使用者 傳送到使用者的手機上使用者透過 簡訊。

本文件將說明如何使用 Firebase SDK

事前準備

  1. 使用前 Firebase Authentication、 您需要新增 Firebase Unity SDK (具體來說 FirebaseAuth.unitypackage) 加入 Unity 專案。

    如需這些初始設定步驟的詳細操作說明,請前往 將 Firebase 新增至您的 Unity 中 專案

  2. 如果您尚未將應用程式連結至 Firebase 專案,請前往 Firebase 控制台
  3. 瞭解電話號碼登入平台的相關規定:
    • 電話號碼登入僅適用於行動平台。
    • 在 iOS 裝置上,電話號碼登入需要使用實體裝置,且無法在模擬器上運作。

安全疑慮

僅使用電話號碼進行驗證,安全性較低 其他可用的方法,因為擁有電話號碼 可以在使用者之間輕鬆轉移此外,當多位使用者共用裝置時 設定檔,任何可接收簡訊的使用者,皆可透過 裝置的電話號碼。

如果您在應用程式中使用電話號碼登入功能,則應提供這項功能 提供更安全的登入方式,並告知使用者這項安全措施 也不必為了使用電話號碼登入而做出取捨

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

您必須先啟用電話號碼登入功能,才能透過簡訊登入使用者 方法:

  1. Firebase 控制台中開啟「驗證」專區。
  2. 在「Sign-in Method」(登入方式) 頁面中啟用電話號碼 登入方式。

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

如要在 iOS 上使用電話號碼驗證功能,您的應用程式必須能 來自 Firebase 的 APN 通知。透過個人手機登入使用者帳戶 第一次在裝置上輸入號碼,Firebase Authentication 就會傳送無聲推送 通知裝置,確認是否收到電話號碼登入要求 即可。(因此,電話號碼登入功能無法用於 模擬工具)。

如何啟用 APN 通知以便與 Firebase Authentication 搭配使用:

  1. 在 Xcode 中, 為專案啟用推播通知
  2. 將 APN 憑證上傳至 Firebase。 如果您還沒有 APN 憑證,請務必前往 Apple Developer Member Center

    1. Firebase 控制台的專案中,選取 齒輪圖示,選取 「Project Settings」,然後選取 「雲端通訊」分頁。

    2. 選取「Upload Certificate」(上傳憑證)。 建立開發憑證的按鈕, 或兩者皆是至少一個 這通常代表交易 不會十分要求關聯語意

    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) => {
        // 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 以便登入使用者
  3. 儲存驗證 ID,並在應用程式載入時還原驗證 ID。獲得解答後 那麼,即使您的應用程式 在使用者完成登入流程前終止 (例如, 切換至簡訊應用程式)。

    您可以視需求保留驗證 ID,方法很簡單 請使用 UnityEngine.PlayerPrefs 儲存驗證 ID。

如果呼叫傳入 codeSent 的回呼,您可以 在使用者透過簡訊收到驗證碼時,提示使用者輸入驗證碼 撰寫新的電子郵件訊息

另一方面,如果 verificationCompleted 的回呼為 表示自動驗證已經成功,您現在 PhoneAuthCredential,您可以按照下文說明使用。

透過驗證碼登入使用者

使用者提供應用程式傳送的驗證碼後 訊息,請建立 PhoneAuthCredential 物件,並將該物件 至 FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync

  1. 向使用者取得驗證碼。
  2. 透過驗證建立 Credential 物件 和驗證 ID
    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。 控管使用者可以存取的資料

您可以讓使用者透過多重驗證機制登入您的應用程式 將驗證供應商憑證連結至 現有的使用者帳戶

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

auth.SignOut();