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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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) => {
        // 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) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // 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) => {
        // 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 Firebase вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.

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

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

auth.SignOut();