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

您可以使用 Firebase 身份驗證通過向用戶的手機發送 SMS 消息來登錄用戶。用戶使用 SMS 消息中包含的一次性代碼登錄。

本文檔介紹瞭如何使用 Firebase SDK 實現電話號碼登錄流程。

在你開始之前

  1. 添加火力地堡到C ++項目
  2. 如果您還沒有連接您的應用程序到你的火力地堡項目,從這樣做火力地堡控制台

在 iOS 上,請注意電話號碼登錄需要物理設備,並且無法在模擬器上運行。

安全問題

僅使用電話號碼的身份驗證雖然方便,但不如其他可用方法安全,因為電話號碼的所有權很容易在用戶之間轉移。此外,在具有多個用戶配置文件的設備上,任何可以接收 SMS 消息的用戶都可以使用設備的電話號碼登錄帳戶。

如果您在應用中使用基於電話號碼的登錄,則應將其與更安全的登錄方法一起提供,並告知用戶使用電話號碼登錄的安全性權衡。

為您的 Firebase 項目啟用電話號碼登錄

要通過短信登錄用戶,您必須首先為 Firebase 項目啟用電話號碼登錄方法:

  1. 火力地堡控制台,打開驗證部分。
  2. 登錄方法頁,使電話號碼登錄方法。

Firebase 的電話號碼登錄請求配額足夠高,大多數應用不會受到影響。但是,如果您需要使用電話身份驗證登錄大量用戶,則可能需要升級定價計劃。請參閱定價頁面。

開始接收 APNs 通知 (iOS)

要在 iOS 上使用電話號碼身份驗證,您的應用必須能夠接收來自 Firebase 的 APNs 通知。當您在設備上首次使用用戶的電話號碼登錄時,Firebase 身份驗證會向設備發送靜默推送通知,以驗證電話號碼登錄請求是否來自您的應用。 (因此,不能在模擬器上使用電話號碼登錄。)

要啟用 APNs 通知以用於 Firebase 身份驗證:

  1. 在Xcode中,啟用推送通知,為您的項目。
  2. 將您的 APNs 證書上傳到 Firebase。如果你不已經有一個的APN證書,確保在創建一個蘋果開發者會員中心

    1. 在火力地堡控制台你的項目中,選擇齒輪圖標,選擇項目設置,然後選擇雲端通訊標籤。

    2. 選擇您的開發證書,您的生產證書或兩者上傳證書按鈕。至少需要一個。

    3. 對於每個證書,選擇 .p12 文件,並提供密碼(如果有)。確保此證書的捆綁 ID 與您的應用程序的捆綁 ID 匹配。選擇保存

向用戶手機發送驗證碼

要啟動手機號碼登錄,顯示用戶界面,提示他們提供他們的電話號碼,然後調用PhoneAuthProvider::VerifyPhoneNumber到請求火力地堡通過短信發送驗證碼到用戶的手機:

  1. 獲取用戶的電話號碼。

    法律要求各不相同,但作為最佳實踐並為您的用戶設定期望,您應該通知他們,如果他們使用電話登錄,他們可能會收到一條 SMS 消息進行驗證,並且適用標準費率。

  2. 呼叫PhoneAuthProvider::VerifyPhoneNumber ,將其傳遞給用戶的電話號碼。
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(Credential 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;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(phone_number, kAutoVerifyTimeOut, null,
                                      &phone_listener);
    
    當你調用PhoneAuthProvider::VerifyPhoneNumber ,火力地堡,
    • (在 iOS 上)向您的應用程序發送靜默推送通知,
    • 向指定的電話號碼發送包含驗證碼的 SMS 消息,並將驗證 ID 傳遞給您的完成功能。您將需要驗證碼和驗證 ID 才能登錄用戶。
  3. 保存驗證 ID 並在您的應用加載時恢復它。通過這樣做,如果您的應用程序在用戶完成登錄流程之前終止(例如,切換到 SMS 應用程序時),您可以確保您仍然擁有有效的驗證 ID。

    您可以以任何方式保留驗證 ID。如果您使用跨平台的 C++ 框架編寫,它應該提供應用程序終止和恢復的通知。對於這些事件,您可以分別保存和恢復驗證 ID。

如果該呼叫VerifyPhoneNumber的結果OnCodeSent被稱為上監聽器,你可以提示用戶,當他們收到的短信輸入驗證碼。

在另一方面,如果調用VerifyPhoneNumber結果OnVerificationCompleted ,然後自動驗證成功時,你會現在有一個Credential與如下所述即可使用。

使用驗證碼登錄用戶

用戶提供從SMS消息的驗證碼應用程式後,通過創建一個登錄用戶Credential從驗證碼和核查ID對象並傳遞該對象Auth::SignInWithCredential

  1. 從用戶處獲取驗證碼。
  2. 創建Credential從驗證碼和核查ID對象。
    Credential 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.
            const 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 != nullptr) {
      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();
    }
    
  • 在你的火力地堡實時數據庫和雲存儲安全規則,你可以得到簽署的,從用戶的唯一的用戶ID auth的變量,並用它來控制哪些數據的用戶可以訪問。

您可以允許用戶通過使用多個身份驗證提供登錄到您的應用程序連接身份驗證提供憑據到現有的用戶帳戶。

要註銷用戶,調用SignOut()

auth->SignOut();