使用電話號碼和 C++ 進行 Firebase 驗證

您可以使用 Firebase 驗證功能傳送簡訊讓使用者登入 傳送到使用者的手機上使用者透過 簡訊。

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

事前準備

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

安全疑慮

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

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

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

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

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

Firebase 的電話號碼登入要求配額夠高,適用於大多數應用程式 不會受到影響但如果需要登入大量使用者 電話驗證,你可能需要升級定價方案。詳情請見 請參閱定價頁面。

開始接收 APN 通知 (Apple 平台)

如要在 Apple 平台上使用電話號碼驗證功能,您的應用程式必須能 來自 Firebase 的 APN 通知。透過個人手機登入使用者帳戶 首次在裝置上輸入號碼,Firebase 驗證會傳送無訊息推送 通知裝置,以驗證電話號碼登入要求 來自您的應用程式。(因此,無法使用電話號碼登入 )。

如何啟用與 Firebase 驗證搭配使用的 APN 通知:

  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 並傳遞至使用者的 電話號碼
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(PhoneAuthCredential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuhtOptions options;
    options.timeout_milliseconds = kAutoVerifyTimeOut;
    options.phone_number = phone_number;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(options, &phone_listener);
    
    呼叫 PhoneAuthProvider::VerifyPhoneNumber、Firebase 時
    • (在 iOS 裝置上) 傳送無聲推播通知至您的應用程式。
    • 傳送內含驗證碼的 SMS 訊息到指定的 並傳送驗證 ID 至完成函式。 您需要驗證碼和驗證 ID,才能 使用者登入
  3. 儲存驗證 ID,並在應用程式載入時還原驗證 ID。獲得解答後 那麼,即使您的應用程式 在使用者完成登入流程前終止 (例如, 切換至簡訊應用程式)。

    您可以視需求保留驗證 ID,如果您是寫信 跨平台 C++ 架構,應該為應用程式提供通知 終止與復原在這些活動中,您可以儲存及還原 驗證 ID。

如果呼叫 VerifyPhoneNumber 的結果為 OnCodeSent 之後,您可以提示使用者輸入驗證碼 驗證碼。

另一方面,如果呼叫 VerifyPhoneNumber 會導致 OnVerificationCompleted,那麼自動驗證已成功 您現在擁有 PhoneAuthCredential,可按照說明 。

透過驗證碼登入使用者

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

  1. 向使用者取得驗證碼。
  2. 透過驗證碼建立 Credential 物件,並 驗證 ID。
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. 使用 Credential 物件登入使用者身分:
    Future<User> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            User user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user.phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user.uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user.provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);
    

後續步驟

使用者首次登入後,系統會建立新的使用者帳戶 也就是使用者的名稱和密碼 號碼或驗證提供者資訊,也就是使用者登入時使用的網址。這項新功能 帳戶儲存為 Firebase 專案的一部分,可用來識別 即可限制使用者登入專案中的所有應用程式

  • 在您的應用程式中,您可以透過 firebase::auth::User 物件:

    firebase::auth::User user = auth->current_user();
    if (user.is_valid()) {
      std::string name = user.display_name();
      std::string email = user.email();
      std::string photo_url = user.photo_url();
      // 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 firebase::auth::User::Token() instead.
      std::string uid = user.uid();
    }
    
  • 在您的 Firebase 即時資料庫和 Cloud Storage 中 查看安全性規則即可 透過 auth 變數取得已登入使用者的不重複使用者 ID。 控管使用者可以存取的資料

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

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

auth->SignOut();