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

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

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

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

  1. Добавьте Firebase в свой проект C++ .
  2. Если вы еще не подключили свое приложение к проекту Firebase, сделайте это из консоли Firebase .
  3. Ознакомьтесь с требованиями платформы для входа по номеру телефона:
    • Вход по номеру телефона предназначен только для мобильных платформ.
    • В iOS для входа по номеру телефона требуется физическое устройство, и он не будет работать на симуляторе.

Вопросы безопасности

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

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

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

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

  1. В консоли Firebase откройте раздел Аутентификация .
  2. На странице «Метод входа» включите метод входа «Номер телефона» .

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

Начать получать уведомления APN (платформы Apple)

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

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

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

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

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

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

Отправить код подтверждения на телефон пользователя

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

  1. Получить номер телефона пользователя.

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

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

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

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

С другой стороны, если вызов VerifyPhoneNumber приводит к OnVerificationCompleted , то автоматическая проверка прошла успешно, и теперь у вас есть PhoneAuthCredential , с которым вы можете использовать, как описано ниже.

Войдите в систему с кодом подтверждения

После того как пользователь предоставит вашему приложению код подтверждения из SMS-сообщения, войдите в систему, создав объект PhoneAuthCredential из кода подтверждения и идентификатора подтверждения и передав этот объект в Auth::SignInWithCredential .

  1. Получите код подтверждения от пользователя.
  2. Создайте объект Credential из кода подтверждения и идентификатора подтверждения.
    PhoneAuthCredential 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.
            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 и облачного хранилища вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.

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

Чтобы выйти из системы, вызовите SignOut() :

auth->SignOut();