Вы можете использовать Firebase Authentication для входа пользователя, отправив SMS-сообщение на его телефон. Пользователь авторизуется, используя одноразовый код, содержащийся в SMS-сообщении.
В этом документе описывается, как реализовать процесс входа по номеру телефона с использованием Firebase SDK.
Прежде чем начать
- Добавьте Firebase в ваш проект C++ .
- Если вы еще не подключили свое приложение к проекту Firebase, сделайте это из консоли Firebase .
- Ознакомьтесь с требованиями платформы для входа по номеру телефона:
- Вход по номеру телефона возможен только для мобильных платформ.
- На устройствах iOS для входа по номеру телефона требуется физическое устройство, и он не будет работать на симуляторе.
Проблемы безопасности
Аутентификация только по номеру телефона, хоть и удобна, менее безопасна, чем другие доступные методы, поскольку владение номером телефона может легко передаваться от одного пользователя другому. Кроме того, на устройствах с несколькими профилями любой пользователь, принимающий SMS, может войти в учётную запись, используя номер телефона устройства.
Если вы используете в своем приложении вход по номеру телефона, вам следует предложить его наряду с более безопасными методами входа и проинформировать пользователей о недостатках безопасности при использовании входа по номеру телефона.
Включите вход по номеру телефона для вашего проекта Firebase
Чтобы авторизовать пользователей с помощью SMS, необходимо сначала включить метод входа по номеру телефона для вашего проекта Firebase:
- В консоли Firebase откройте раздел «Аутентификация» .
- На странице «Способ входа» включите способ входа по номеру телефона .
- Необязательно : на странице настроек задайте политику регионов, в которых вы хотите разрешить или запретить отправку SMS-сообщений. Настройка политики региона для SMS поможет защитить ваши приложения от злоупотреблений SMS.
Начните получать уведомления APNs (платформы Apple)
Для использования аутентификации по номеру телефона на платформах Apple ваше приложение должно иметь возможность получать уведомления APN от Firebase. При первом входе пользователя с использованием его номера телефона на устройство Firebase Authentication отправляет на него скрытое push-уведомление, чтобы убедиться, что запрос на вход по номеру телефона исходит от вашего приложения. (По этой причине вход по номеру телефона не может быть использован в симуляторе.)
Чтобы включить уведомления APNs для использования с Firebase Authentication :
- В Xcode включите push-уведомления для вашего проекта.
Загрузите свой сертификат APNs в Firebase. Если у вас ещё нет сертификата APNs, создайте его в Центре разработчиков Apple .
Внутри вашего проекта в консоли Firebase выберите значок шестеренки, выберите Настройки проекта , а затем выберите вкладку Облачные сообщения .
Нажмите кнопку «Загрузить сертификат» для вашего сертификата разработки, сертификата производства или обоих. Требуется как минимум один сертификат.
Для каждого сертификата выберите файл .p12 и укажите пароль, если он есть. Убедитесь, что идентификатор пакета этого сертификата совпадает с идентификатором пакета вашего приложения. Нажмите «Сохранить» .
Отправить проверочный код на телефон пользователя
Чтобы инициировать вход по номеру телефона, предоставьте пользователю интерфейс, предлагающий ему указать свой номер телефона, а затем вызовите PhoneAuthProvider::VerifyPhoneNumber
, чтобы запросить у Firebase отправку кода аутентификации на телефон пользователя по SMS:
Получите номер телефона пользователя.
Юридические требования различаются, но в качестве наилучшей практики и для того, чтобы сформировать у пользователей определенные ожидания, вам следует сообщить им, что при использовании входа с телефона им может быть отправлено SMS-сообщение для подтверждения, и будут применяться стандартные тарифы.
- Вызовите
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) отправляет тихое push-уведомление в ваше приложение,
- Отправляет SMS-сообщение с кодом аутентификации на указанный номер телефона и передаёт идентификатор подтверждения в функцию завершения. Для входа пользователя вам понадобятся как код подтверждения, так и идентификатор подтверждения.
Сохраните идентификатор проверки и восстановите его при загрузке приложения. Это гарантирует, что ваш идентификатор проверки останется действительным, даже если приложение будет закрыто до того, как пользователь завершит процесс входа (например, при переходе в приложение для отправки SMS).
Вы можете сохранить идентификатор проверки любым удобным для вас способом. Если вы используете кроссплатформенный фреймворк C++, он должен предоставлять уведомления о завершении и восстановлении приложения. При этих событиях вы можете сохранить и восстановить идентификатор проверки соответственно.
Если вызов VerifyPhoneNumber
приводит к вызову OnCodeSent
на вашем прослушивателе, вы можете предложить пользователю ввести код подтверждения при его получении в SMS-сообщении.
С другой стороны, если вызов VerifyPhoneNumber
приводит к OnVerificationCompleted
, то автоматическая проверка прошла успешно, и теперь у вас есть PhoneAuthCredential
, который вы можете использовать, как описано ниже.
Авторизуйте пользователя с помощью проверочного кода.
После того как пользователь предоставит вашему приложению проверочный код из SMS-сообщения, выполните вход пользователя в систему, создав объект PhoneAuthCredential
из проверочного кода и идентификатора проверки и передав этот объект в Auth::SignInWithCredential
.
- Получите проверочный код от пользователя.
- Создайте объект
Credential
из кода проверки и идентификатора проверки.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
и использовать его для управления данными, к которым пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Чтобы выйти из системы пользователя, вызовите SignOut()
:
auth->SignOut();