您可以使用 Firebase Authentication 傳送簡訊來登入使用者 傳送到使用者的手機上使用者透過 簡訊。
本文件將說明如何使用 Firebase SDK
事前準備
- 將 Firebase 新增至 C++ 專案。
- 如果您尚未將應用程式連結至 Firebase 專案,請前往 Firebase 控制台。
- 瞭解電話號碼登入平台的相關規定:
- 電話號碼登入僅適用於行動平台。
- 在 iOS 裝置上,電話號碼登入需要使用實體裝置,且無法在模擬器上運作。
安全疑慮
僅使用電話號碼進行驗證,安全性較低 其他可用的方法,因為擁有電話號碼 可以在使用者之間輕鬆轉移此外,當多位使用者共用裝置時 設定檔,任何可接收簡訊的使用者,皆可透過 裝置的電話號碼。
如果您在應用程式中使用電話號碼登入功能,則應提供這項功能 提供更安全的登入方式,並告知使用者這項安全措施 也不必為了使用電話號碼登入而做出取捨
為 Firebase 專案啟用電話號碼登入功能
您必須先啟用電話號碼登入功能,才能透過簡訊登入使用者 方法:
- 在 Firebase 控制台中開啟「驗證」專區。
- 在「Sign-in Method」(登入方式) 頁面中啟用電話號碼 登入方式。
開始接收 APN 通知 (Apple 平台)
如要在 Apple 平台上使用電話號碼驗證功能,您的應用程式必須能 來自 Firebase 的 APN 通知。透過個人手機登入使用者帳戶 第一次在裝置上輸入號碼,Firebase Authentication 就會傳送無聲推送 通知裝置,以驗證電話號碼登入要求 來自您的應用程式。(因此,無法使用電話號碼登入 )。
如何啟用 APN 通知以便與 Firebase Authentication 搭配使用:
- 在 Xcode 中, 為專案啟用推播通知。
將 APN 憑證上傳至 Firebase。 如果您還沒有 APN 憑證,請務必前往 Apple Developer Member Center。
-
在 Firebase 控制台的專案中,選取 齒輪圖示,選取 「Project Settings」,然後選取 「雲端通訊」分頁。
-
選取「Upload Certificate」(上傳憑證)。 建立開發憑證的按鈕, 或兩者皆是至少一個 這通常代表交易 不會十分要求關聯語意
-
針對每個憑證選取 .p12 檔案,然後提供 密碼 (如果有的話)。請確定這個憑證的軟體包 ID 必須與應用程式的軟體包 ID 相符。選取 按一下「儲存」。
-
將驗證碼傳送至使用者的手機
如要啟動電話號碼登入程序,請向使用者顯示提示的介面
他們提供電話號碼,然後撥打
PhoneAuthProvider::VerifyPhoneNumber
:要求 Firebase 傳送
透過簡訊將驗證碼傳送至使用者手機:
-
取得使用者的電話號碼。
法律要求各有不同,但我們建議的最佳做法是 並營造使用者的期待感,您應告知他們, 手機登入時,可能會收到驗證和標準簡訊 需支付簡訊費用。
- 呼叫
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,才能 使用者登入
-
儲存驗證 ID,並在應用程式載入時還原驗證 ID。獲得解答後 那麼,即使您的應用程式 在使用者完成登入流程前終止 (例如, 切換至簡訊應用程式)。
您可以視需求保留驗證 ID,如果您是寫信 跨平台 C++ 架構,應該為應用程式提供通知 終止與復原在這些活動中,您可以儲存及還原 驗證 ID。
如果呼叫 VerifyPhoneNumber
的結果為 OnCodeSent
之後,您可以提示使用者輸入驗證碼
驗證碼。
另一方面,如果呼叫 VerifyPhoneNumber
會導致
OnVerificationCompleted
,那麼自動驗證已成功
您現在擁有 PhoneAuthCredential
,可按照說明
。
透過驗證碼登入使用者
使用者提供應用程式傳送的驗證碼後
訊息,請建立 PhoneAuthCredential
物件,並將該物件
至 Auth::SignInWithCredential
。
- 向使用者取得驗證碼。
- 透過驗證碼建立
Credential
物件,並 驗證 ID。PhoneAuthCredential credential = phone_auth_provider->GetCredential( verification_id_.c_str(), verification_code.c_str());
- 使用
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 Database和Cloud Storage中 查看安全性規則 透過
auth
變數取得已登入使用者的不重複使用者 ID。 控管使用者可以存取的資料
您可以讓使用者透過多重驗證機制登入您的應用程式 將驗證供應商憑證連結至 現有的使用者帳戶
如要登出使用者,請呼叫
SignOut()
:
auth->SignOut();