Google 致力于为黑人社区推动种族平等。查看具体举措

Аутентификация с Firebase с использованием номера телефона и C ++

Вы можете использовать Firebase Authentication для входа пользователя в систему, отправив SMS-сообщение на телефон пользователя. Пользователь входит в систему, используя одноразовый код, содержащийся в SMS-сообщении.

В этом документе описывается, как реализовать поток входа по номеру телефона с помощью Firebase SDK.

Прежде чем вы начнете

  1. Добавить Firebase в свой проект C ++ .
  2. Если вы еще не подключили приложение к вашему проекту Firebase, сделать это из консоли Firebase .

Обратите внимание, что в iOS для входа по номеру телефона требуется физическое устройство, и он не будет работать на симуляторе.

Проблемы безопасности

Аутентификация с использованием только номера телефона, хотя и удобна, но менее безопасна, чем другие доступные методы, поскольку обладание номером телефона может легко передаваться между пользователями. Кроме того, на устройствах с несколькими профилями пользователей любой пользователь, который может получать SMS-сообщения, может войти в учетную запись, используя номер телефона устройства.

Если вы используете в своем приложении вход на основе номера телефона, вы должны предложить его наряду с более безопасными методами входа и проинформировать пользователей о компромиссах безопасности при использовании входа по номеру телефона.

Включите вход по номеру телефона для своего проекта Firebase

Чтобы входить в систему с помощью SMS, вы должны сначала включить метод входа по номеру телефона для своего проекта Firebase:

  1. В Firebase консоли откройте раздел Проверка подлинности.
  2. На странице входа в методе, включите номер телефона вход в методе.

Квота запросов на вход по телефонному номеру Firebase достаточно высока, поэтому большинство приложений не будут затронуты. Однако, если вам нужно войти в систему очень большого количества пользователей с помощью аутентификации по телефону, вам может потребоваться обновить тарифный план. Смотрите ценовую страницу.

Начать получать уведомления об APN (iOS)

Чтобы использовать аутентификацию по номеру телефона на iOS, ваше приложение должно иметь возможность получать уведомления APN от Firebase. Когда вы впервые входите в систему с помощью номера телефона на устройстве, Firebase Authentication отправляет на устройство тихое push-уведомление, чтобы убедиться, что запрос на вход по номеру телефона поступает из вашего приложения. (По этой причине вход по номеру телефона нельзя использовать в симуляторе.)

Чтобы включить уведомления APN для использования с аутентификацией Firebase:

  1. В Xcode, включить уведомление толчка для вашего проекта.
  2. Загрузите свой сертификат APNs в Firebase. Если вы уже не имеете сертификат APNs, убедитесь , что создать в компании Apple Developer Center член .

    1. Внутри вашего проекта в Firebase консоли, выберите значок шестеренки, выберите Настройки проекта, а затем выберите вкладку Cloud Messaging.

    2. Нажмите кнопку Загрузить сертификат для сертификата развития, свидетельства о производстве, или оба. Требуется хотя бы один.

    3. Для каждого сертификата выберите файл .p12 и укажите пароль, если таковой имеется. Убедитесь, что идентификатор пакета для этого сертификата совпадает с идентификатором пакета вашего приложения. Выберите Сохранить.

Отправьте проверочный код на телефон пользователя

Для того, чтобы инициировать телефонный номер входа, представить пользователю интерфейс , который побуждает их указать свой номер телефона, а затем вызвать PhoneAuthProvider::VerifyPhoneNumber для запроса, Firebase отправить код аутентификации на телефон пользователя по SMS:

  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 , Firebase,
    • (на iOS) отправляет тихое push-уведомление в ваше приложение,
    • отправляет SMS-сообщение, содержащее код аутентификации, на указанный номер телефона и передает идентификатор подтверждения вашей функции завершения. Для входа пользователя вам потребуются как проверочный код, так и проверочный идентификатор.
  3. Сохраните идентификатор подтверждения и восстановите его при загрузке приложения. Таким образом, вы можете быть уверены, что у вас по-прежнему есть действующий идентификатор подтверждения, если ваше приложение завершается до того, как пользователь завершит процесс входа (например, при переключении на приложение SMS).

    Вы можете сохранить проверочный идентификатор как хотите. Если вы пишете с кросс-платформенной структурой C ++, она должна предоставлять уведомления о завершении работы приложения и восстановлении. По этим событиям вы можете сохранить и восстановить, соответственно, идентификатор подтверждения.

Если вызов VerifyPhoneNumber результатов в OnCodeSent вызывается на вашем Listener, вы можете предложить пользователю ввести код подтверждения , когда они получают его в сообщении SMS.

С другой стороны, если вызов 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();
    }
    
  • В вашей базе данных в реальном времени и Firebase Cloud Storage правил безопасности , вы можете получить подписанный в уникальном пользователя идентификатор пользователя из auth переменной и использовать его , чтобы контролировать , какие данные пользователь заходит может.

Вы можете позволить пользователям входить в ваше приложение с помощью нескольких поставщиков проверки подлинности с помощью ссылки AUTH учетных данных поставщика к существующему учетной записи пользователя.

Чтобы выйти пользователь, вызовите SignOut() :

auth->SignOut();