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

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

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

事前準備

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

安全疑慮

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

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

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

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

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

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

如要在 Apple 平台上使用電話號碼驗證功能,您的應用程式必須能 來自 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 並傳遞至使用者的 電話號碼
    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 Realtime DatabaseCloud Storage中 查看安全性規則 透過 auth 變數取得已登入使用者的不重複使用者 ID。 控管使用者可以存取的資料

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

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

auth->SignOut();