您可以使用Firebase身份驗證通過將SMS消息發送到用戶的電話來登錄用戶。用戶使用SMS消息中包含的一次性代碼登錄。
本文檔介紹瞭如何使用Firebase SDK實施電話號碼登錄流程。
在你開始之前
- 將Firebase添加到您的C ++項目。
- 如果您尚未將應用程序連接到Firebase項目,請從Firebase控制台進行。
在iOS上,請注意,電話號碼登錄需要使用物理設備,並且不能在模擬器上使用。
安全問題
僅使用電話號碼進行身份驗證雖然方便,但比其他可用方法安全性低,因為擁有電話號碼的身份可以在用戶之間輕鬆轉移。此外,在具有多個用戶配置文件的設備上,任何可以接收SMS消息的用戶都可以使用設備的電話號碼登錄到帳戶。
如果您在應用中使用基於電話號碼的登錄,則應將其與更安全的登錄方法一起提供,並告知用戶使用電話號碼登錄的安全權衡。
為您的Firebase項目啟用電話號碼登錄
要通過SMS登錄用戶,必須首先為Firebase項目啟用“電話號碼”登錄方法:
- 在Firebase控制台中,打開“身份驗證”部分。
- 在“登錄方法”頁面上,啟用“電話號碼”登錄方法。
Firebase的電話號碼登錄請求配額足夠高,因此大多數應用程序都不會受到影響。但是,如果需要使用電話身份驗證登錄大量用戶,則可能需要升級定價計劃。請參閱定價頁面。
開始接收APNs通知(iOS)
要在iOS上使用電話號碼身份驗證,您的應用必須能夠從Firebase接收APNs通知。當您首次在設備上使用其電話號碼登錄用戶時,Firebase身份驗證會向設備發送靜默推送通知,以驗證電話號碼登錄請求是否來自您的應用程序。 (因此,不能在模擬器上使用電話號碼登錄。)
啟用APNs通知以與Firebase身份驗證一起使用:
- 在Xcode中,為您的項目啟用推送通知。
將您的APNs證書上傳到Firebase。如果您還沒有APNs證書,請參閱設置APNs SSL證書。
在Firebase控制台的項目內部,選擇齒輪圖標,選擇Project Settings ,然後選擇Cloud Messaging選項卡。
選擇開發證書和/或生產證書的“上傳證書”按鈕。至少需要一個。
對於每個證書,選擇.p12文件,並提供密碼(如果有)。確保此證書的捆綁包ID與您的應用的捆綁包ID匹配。選擇保存。
將驗證碼發送到用戶的手機
要啟動電話號碼登錄,請向用戶顯示一個界面,提示他們提供他們的電話號碼,然後調用PhoneAuthProvider::VerifyPhoneNumber
以請求Firebase通過SMS將驗證碼發送到用戶的電話:
獲取用戶的電話號碼。
法律要求各不相同,但是作為最佳實踐並為用戶設定期望,您應該告知他們,如果他們使用電話登錄,則他們可能會收到SMS消息以進行驗證,並採用標準費率。
- 調用
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
,Firebase,- (在iOS上)向您的應用發送靜默推送通知,
- 將包含驗證碼的SMS消息發送到指定的電話號碼,並將驗證ID傳遞給您的完成功能。您將需要驗證碼和驗證ID來登錄用戶。
保存驗證ID並在應用加載時將其還原。這樣,如果您的應用在用戶完成登錄流程之前(例如,切換到SMS應用時)終止,則可以確保您仍然具有有效的驗證ID。
您可以使用任何方式保留驗證ID。如果您使用的是跨平台的C ++框架,則它應提供有關終止和恢復應用程序的通知。在這些事件上,您可以分別保存和還原驗證ID。
如果該呼叫VerifyPhoneNumber
的結果OnCodeSent
被稱為上監聽器,你可以提示用戶,當他們收到的短信輸入驗證碼。
另一方面,如果對VerifyPhoneNumber
的調用導致OnVerificationCompleted
,則自動驗證已成功,並且您現在將擁有一個Credential
,可以按以下說明使用它。
使用驗證碼登錄用戶
用戶向您的應用程序提供SMS消息中的驗證碼後,通過根據驗證碼和驗證ID創建Credential
對象並將該對像傳遞給Auth::SignInWithCredential
來Auth::SignInWithCredential
。
- 從用戶那裡獲取驗證碼。
- 根據驗證碼和驗證ID創建一個
Credential
對象。Credential 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. 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(); }
在Firebase實時數據庫和雲存儲安全規則中,您可以從
auth
變量中獲取登錄用戶的唯一用戶ID,並使用它來控制用戶可以訪問哪些數據。
通過將身份驗證提供程序憑據鏈接到現有用戶帳戶,可以允許用戶使用多個身份驗證提供程序登錄您的應用程序。
要註銷用戶,請調用SignOut()
:
auth->SignOut();