Для авторизации пользователя с помощью Firebase Authentication можно отправить SMS-сообщение на телефон пользователя. Пользователь авторизуется, используя одноразовый код, содержащийся в SMS-сообщении.
В этом документе описывается, как реализовать вход в систему по номеру телефона с использованием Firebase SDK.
Прежде чем начать
- Добавьте Firebase в свой проект на C++ .
- Если вы еще не подключили свое приложение к проекту Firebase, сделайте это через консоль Firebase .
- Ознакомьтесь с требованиями платформы для входа в систему по номеру телефона:
- Вход по номеру телефона доступен только на мобильных платформах.
- На iOS для входа по номеру телефона требуется физическое устройство, и на симуляторе это не работает.
Вопросы безопасности
Аутентификация только по номеру телефона, хотя и удобна, менее безопасна, чем другие доступные методы, поскольку номер телефона может легко передаваться от одного пользователя к другому. Кроме того, на устройствах с несколькими профилями пользователей любой пользователь, имеющий возможность получать SMS-сообщения, может войти в учетную запись, используя номер телефона устройства.
Если в вашем приложении используется вход по номеру телефона, следует предлагать его наряду с более безопасными способами входа и информировать пользователей о компромиссах в плане безопасности, связанных с использованием входа по номеру телефона.
Включите вход по номеру телефона для вашего проекта Firebase.
Для авторизации пользователей по SMS необходимо сначала включить метод авторизации по номеру телефона в вашем проекте Firebase:
- В консоли Firebase откройте раздел «Аутентификация» .
- На странице «Способ входа» включите способ входа по номеру телефона .
- На странице «Настройки» задайте политику для регионов, в которые вы хотите разрешить или запретить отправку SMS-сообщений. Для новых проектов политика по умолчанию не разрешает отправку сообщений ни в один регион.
Начать получать уведомления от APNs (платформы Apple)
Для использования аутентификации по номеру телефона на платформах Apple ваше приложение должно получать уведомления APNs от 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();