Вы можете использовать Firebase Authentication, чтобы войти в аккаунт пользователя, отправив SMS-сообщение на его телефон. Пользователь входит в аккаунт с помощью одноразового кода из SMS.
В этом документе описано, как реализовать вход с помощью номера телефона, используя Firebase SDK.
Подготовка
-
Чтобы использовать Firebase Authentication, вам нужно добавить в проект Unity Firebase Unity SDK (а именно
FirebaseAuth.unitypackage).Подробные инструкции по первоначальной настройке смотрите в статье Как добавить Firebase в свой проект Unity.
- Если вы ещё не подключили приложение к проекту Firebase, сделайте это в консоли Firebase.
- Ознакомьтесь с требованиями к платформе для входа с помощью номера телефона:
- Вход с помощью номера телефона доступен только на мобильных платформах.
- На устройствах iOS вход с помощью номера телефона требует наличия физического устройства и не работает на симуляторе.
Проблемы с безопасностью
Аутентификация только по номеру телефона, хотя и удобна, менее безопасна, чем другие доступные методы, поскольку номер телефона легко передать другому пользователю. Кроме того, на устройствах с поддержкой нескольких пользователей любой пользователь, который может получать SMS-сообщения, может войти в аккаунт, используя номер телефона устройства.
Если в вашем приложении для входа используется номер телефона, предложите пользователям более безопасные способы входа и расскажите о рисках, связанных с использованием номера телефона.
Как включить вход с помощью номера телефона в проекте Firebase
Чтобы пользователи могли входить в аккаунт с помощью SMS, сначала включите в проекте Firebase метод входа с номером телефона:
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Sign-in method (Способ входа) включите поставщика для входа с помощью Phone (Телефона).
-
Настройте правило для регионов, в которые вы хотите разрешить или запретить отправку SMS. Правило для региона SMS помогает защитить приложения от злоупотреблений с помощью SMS. Для новых проектов политика по умолчанию не разрешает использование регионов.
- В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.
- В разделе Правила в отношении регионов хранения данных для SMS настройте правила в отношении регионов хранения данных для SMS.
Как начать получать уведомления APNs (только для iOS)
Чтобы использовать аутентификацию по номеру телефона в iOS, ваше приложение должно получать уведомления APNs от Firebase. Когда пользователь впервые входит в аккаунт на устройстве, используя номер телефона, Firebase Authentication отправляет на устройство скрытое push-уведомление, чтобы подтвердить, что запрос на вход с номером телефона поступил из вашего приложения. По этой причине вход с номером телефона нельзя использовать на симуляторе.
Чтобы включить уведомления APNs для использования с Firebase Authentication:
- В Xcode включите push-уведомления для своего проекта.
Загрузите сертификат APNs в Firebase. Если у вас ещё нет сертификата APNs, создайте его в Центре разработчиков Apple.
-
В консоли Firebase выберите
Настройки > Общие. Затем нажмите на вкладку Обмен сообщениями в облаке. - Нажмите Загрузить сертификат для сертификата разработчика, производственного сертификата или обоих. Обязательно заполните как минимум одно из этих полей.
-
Для каждого сертификата выберите файл
.p12и укажите пароль, если он есть. Убедитесь, что идентификатор пакета для этого сертификата совпадает с идентификатором пакета вашего приложения. Нажмите Сохранить.
-
В консоли Firebase выберите
Отправить код подтверждения на телефон пользователя.
Чтобы начать вход с номером телефона, покажите пользователю интерфейс, в котором он сможет ввести свой номер, а затем вызовите PhoneAuthProvider.VerifyPhoneNumber, чтобы Firebase отправил код аутентификации на телефон пользователя по SMS:
-
Получить номер телефона пользователя.
Требования законодательства могут различаться, но мы рекомендуем сообщать пользователям, что при входе с помощью номера телефона они могут получить SMS с кодом подтверждения, за которое будет взиматься стандартная плата.
- Вызовите
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-сообщение с кодом аутентификации на указанный номер телефона и передает идентификатор проверки в функцию завершения. Чтобы войти в аккаунт пользователя, вам понадобятся код подтверждения и идентификатор подтверждения.
-
Сохраните идентификатор проверки и восстановите его при загрузке приложения. Это позволит вам сохранить действительный идентификатор проверки, если приложение будет закрыто до того, как пользователь завершит процесс входа (например, при переключении на приложение для обмена SMS).
Вы можете сохранить идентификатор подтверждения любым удобным способом. Самый простой способ – сохранить идентификатор подтверждения с помощью
UnityEngine.PlayerPrefs.
Если вызывается функция обратного вызова, переданная в codeSent, вы можете предложить пользователю ввести код подтверждения, полученный в SMS-сообщении.
Если вызывается обратный вызов для verificationCompleted, значит автоматическая проверка прошла успешно и у вас есть PhoneAuthCredential, который можно использовать, как описано ниже.
Как войти в аккаунт с помощью кода подтверждения
После того как пользователь введет в приложении код подтверждения из SMS, выполните вход, создав объект PhoneAuthCredential на основе кода подтверждения и идентификатора проверки и передав этот объект в FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync.
- Получите код подтверждения от пользователя.
- Создайте объект
Credentialна основе кода подтверждения и идентификатора подтверждения.PhoneAuthCredential credential = phoneAuthProvider.GetCredential(verificationId, verificationCode);
- Войдите в аккаунт пользователя с помощью объекта
PhoneAuthCredential:auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => { 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();