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

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

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

Прежде чем начать

  1. Прежде чем использовать Firebase Authentication , необходимо добавить SDK Firebase Unity (а именно, FirebaseAuth.unitypackage ) в ваш проект Unity.

    Подробные инструкции по этим начальным шагам настройки вы найдете в разделе «Добавление Firebase в ваш проект Unity» .

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

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

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

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

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

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

  1. В консоли Firebase откройте раздел «Аутентификация» .
  2. На странице «Способ входа» включите способ входа по номеру телефона .
  3. На странице «Настройки» задайте политику для регионов, в которые вы хотите разрешить или запретить отправку SMS-сообщений. Для новых проектов политика по умолчанию не разрешает отправку сообщений ни в один регион.

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

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

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

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

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

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

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

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

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

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

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

  2. Вызовите метод PhoneAuthProvider.VerifyPhoneNumber , передав ему объект PhoneAuthOptions, содержащий номер телефона пользователя.
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) =&gt {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) =&gt {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) =&gt {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) =&gt {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    При вызове PhoneAuthProvider.VerifyPhoneNumber в Firebase,
    • (на iOS) отправляет бесшумное push-уведомление в ваше приложение.
    • Firebase отправляет SMS-сообщение с кодом аутентификации на указанный номер телефона и передает идентификатор подтверждения в вашу функцию автодополнения. Для авторизации пользователя вам понадобятся как код подтверждения, так и идентификатор подтверждения.
  3. Сохраните идентификатор подтверждения и восстановите его при загрузке приложения. Таким образом, вы можете быть уверены, что у вас останется действительный идентификатор подтверждения, если приложение будет закрыто до того, как пользователь завершит процесс входа в систему (например, при переключении на приложение для SMS).

    Вы можете сохранить идентификатор подтверждения любым удобным для вас способом. Простой способ — сохранить идентификатор подтверждения с помощью UnityEngine.PlayerPrefs .

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

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

Войдите в систему, используя код подтверждения.

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

  1. Получите от пользователя код подтверждения.
  2. Создайте объект Credential на основе кода подтверждения и идентификатора подтверждения.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. Войдите в систему, используя объект PhoneAuthCredential :
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task =&gt {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });

Следующие шаги

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

  • В ваших приложениях вы можете получить основную информацию профиля пользователя из объекта Firebase.Auth.FirebaseUser :

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // 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 User.TokenAsync() instead.
      string uid = user.UserId;
    }
  • В правилах безопасности Firebase Realtime Database и Cloud Storage вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления доступом пользователя к данным.

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

Для выхода пользователя из системы вызовите SignOut() :

auth.SignOut();