Аутентификация по телефону

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

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

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

Настраивать

Прежде чем приступить к проверке подлинности по телефону, убедитесь, что вы выполнили следующие шаги:

  1. Включите телефон в качестве метода входа в консоли Firebase .
  2. Android : если вы еще не установили хэш SHA-1 своего приложения в консоли Firebase , сделайте это. См. раздел «Аутентификация вашего клиента» для получения информации о поиске хеша SHA-1 вашего приложения.
  3. iOS : в Xcode включите push-уведомления для вашего проекта и убедитесь, что ваш ключ аутентификации APN настроен с помощью Firebase Cloud Messaging (FCM) . Кроме того, необходимо включить фоновые режимы для удаленных уведомлений. Подробное объяснение этого шага можно найти в документации Firebase iOS Phone Auth .
  4. Интернет : убедитесь, что вы добавили домен своего приложения на консоли Firebase в разделе Домены перенаправления OAuth .

Примечание ; Вход в систему по номеру телефона доступен только для использования на реальных устройствах и в Интернете. Чтобы протестировать процесс аутентификации на эмуляторах устройств, см. раздел Тестирование .

Применение

Firebase Authentication SDK для Flutter предоставляет два отдельных способа входа пользователя в систему с использованием его номера телефона. Нативные платформы (например, Android и iOS) предоставляют другие функциональные возможности для проверки номера телефона, чем веб-версии, поэтому для каждой платформы существуют два метода:

  • Собственная платформа : verifyPhoneNumber .
  • Веб-платформа : signInWithPhoneNumber .

Родной: verifyPhoneNumber

На собственных платформах номер телефона пользователя должен быть сначала проверен, а затем пользователь может либо войти в систему, либо связать свою учетную запись с PhoneAuthCredential .

Сначала вы должны запросить у пользователя номер телефона. После предоставления вызовите методverifyPhoneNumber verifyPhoneNumber() :

await FirebaseAuth.instance.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) {},
  verificationFailed: (FirebaseAuthException e) {},
  codeSent: (String verificationId, int? resendToken) {},
  codeAutoRetrievalTimeout: (String verificationId) {},
);

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

  1. verificationCompleted : автоматическая обработка SMS-кода на устройствах Android.
  2. verificationFailed : обработка событий сбоя, таких как неверные номера телефонов или превышение квоты SMS.
  3. codeSent : обрабатывает отправку кода на устройство из Firebase, который используется для приглашения пользователей ввести код.
  4. codeAutoRetrivalTimeout : обрабатывает тайм-аут при сбое автоматической обработки кода SMS.

проверка завершена

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

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

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) async {
    // ANDROID ONLY!

    // Sign the user in (or link) with the auto-generated credential
    await auth.signInWithCredential(credential);
  },
);

проверка не пройдена

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

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationFailed: (FirebaseAuthException e) {
    if (e.code == 'invalid-phone-number') {
      print('The provided phone number is not valid.');
    }

    // Handle other errors
  },
);

код отправлен

Когда Firebase отправляет SMS-код на устройство, этот обработчик запускается с verificationId и resendToken ( resendToken поддерживается только на устройствах Android, устройства iOS всегда будут возвращать null значение).

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

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  codeSent: (String verificationId, int? resendToken) async {
    // Update the UI - wait for the user to enter the SMS code
    String smsCode = 'xxxx';

    // Create a PhoneAuthCredential with the code
    PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);

    // Sign the user in (or link) with the credential
    await auth.signInWithCredential(credential);
  },
);

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

кодауторетривалтимеаут

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

По умолчанию устройство ожидает 30 секунд, однако это время можно настроить с помощью аргумента timeout :

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  timeout: const Duration(seconds: 60),
  codeAutoRetrievalTimeout: (String verificationId) {
    // Auto-resolution timed out...
  },
);

Веб: signInWithPhoneNumber

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

Firebase Authentication SDK для Flutter по умолчанию управляет виджетом reCAPTCHA, однако обеспечивает контроль над тем, как он отображается и настраивается, если это необходимо. Для начала вызовите метод signInWithPhoneNumber с номером телефона.

FirebaseAuth auth = FirebaseAuth.instance;

// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');

Вызов метода сначала приведет к отображению виджета reCAPTCHA. Пользователь должен пройти тест перед отправкой SMS-кода. После завершения вы можете войти в систему, предоставив код SMS методу confirm в разрешенном ответе ConfirmationResult :

UserCredential userCredential = await confirmationResult.confirm('123456');

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

Конфигурация reCAPTCHA

Виджет reCAPTCHA — это полностью управляемый процесс, обеспечивающий безопасность вашего веб-приложения.

Второй аргумент signInWithPhoneNumber принимает необязательный экземпляр RecaptchaVerifier , который можно использовать для управления виджетом. По умолчанию виджет отображается как невидимый при запуске процесса входа. «Невидимый» виджет появится в виде полностраничного модального окна поверх вашего приложения.

Однако можно отобразить встроенный виджет, который пользователь должен явно нажать, чтобы подтвердить свою личность.

Чтобы добавить встроенный виджет, укажите идентификатор элемента DOM в аргументе container экземпляра RecaptchaVerifier . Элемент должен существовать и быть пустым, иначе будет выдана ошибка. Если аргумент container не указан, виджет будет отображаться как «невидимый».

ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));

При желании вы можете изменить размер и тему, настроив аргументы size и theme , как показано выше.

Также можно прослушивать события, например, был ли reCAPTCHA выполнен пользователем, истек ли срок действия reCAPTCHA или возникла ошибка:

RecaptchaVerifier(
  onSuccess: () => print('reCAPTCHA Completed!'),
  onError: (FirebaseAuthException error) => print(error),
  onExpired: () => print('reCAPTCHA Expired!'),
);

Тестирование

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

  1. В консоли Firebase выберите поставщика аутентификации «Телефон» и щелкните раскрывающийся список «Номера телефонов для тестирования».
  2. Введите новый номер телефона (например +44 7444 555666 ) и тестовый код (например, 123456 ).

Если предоставить тестовый номер телефона методам verifyPhoneNumber или signInWithPhoneNumber , SMS фактически не будет отправлено. Вместо этого вы можете предоставить тестовый код непосредственно PhoneAuthProvider или с помощью обработчика результатов подтверждения signInWithPhoneNumber .