Вы можете использовать Firebase Authentication для входа в систему, отправив SMS-сообщение на телефон пользователя. Пользователь авторизуется с помощью одноразового кода, содержащегося в SMS-сообщении.
Самый простой способ добавить вход в систему по номеру телефона в ваше приложение — использовать FirebaseUI , который включает в себя виджет входа в систему, реализующий потоки входа в систему для входа в систему по номеру телефона, а также вход на основе пароля и федеративный вход. В этом документе описывается, как реализовать процесс входа в систему по номеру телефона с помощью Firebase SDK.
Прежде чем начать
Если вы еще этого не сделали, скопируйте фрагмент инициализации из консоли Firebase в свой проект, как описано в разделе «Добавление Firebase в проект JavaScript» .Проблемы безопасности
Аутентификация с использованием только номера телефона хоть и удобна, но менее безопасна, чем другие доступные методы, поскольку владение номером телефона может легко передаваться между пользователями. Кроме того, на устройствах с несколькими профилями пользователей любой пользователь, который может получать SMS-сообщения, может войти в учетную запись, используя номер телефона устройства.
Если вы используете в своем приложении вход по номеру телефона, вам следует предлагать его наряду с более безопасными методами входа и информировать пользователей о компромиссах безопасности при использовании входа в систему по номеру телефона.
Включите вход по номеру телефона для вашего проекта Firebase
Чтобы войти в систему с помощью SMS, сначала необходимо включить метод входа по номеру телефона для вашего проекта Firebase:
- В консоли Firebase откройте раздел Аутентификация .
- На странице «Метод входа» включите метод входа по номеру телефона .
- Если на той же странице домен, на котором будет размещено ваше приложение, не указан в разделе Домены перенаправления OAuth , добавьте свой домен. Обратите внимание, что localhost не разрешен в качестве размещенного домена для аутентификации по телефону.
Настройте верификатор reCAPTCHA
Прежде чем вы сможете входить в систему пользователей с помощью их номеров телефонов, вам необходимо настроить средство проверки reCAPTCHA Firebase. Firebase использует reCAPTCHA для предотвращения злоупотреблений, например, гарантируя, что запрос на проверку номера телефона поступает из одного из разрешенных доменов вашего приложения.
Вам не нужно вручную настраивать клиент reCAPTCHA; когда вы используете объект RecaptchaVerifier
Firebase SDK, Firebase автоматически создает и обрабатывает все необходимые клиентские ключи и секреты.
Объект RecaptchaVerifier
поддерживает невидимый reCAPTCHA , который часто может проверять пользователя, не требуя каких-либо действий со стороны пользователя, а также виджет reCAPTCHA, который всегда требует взаимодействия с пользователем для успешного завершения.
Базовый отображаемый reCAPTCHA может быть локализован в соответствии с предпочтениями пользователя путем обновления языкового кода в экземпляре Auth перед отображением reCAPTCHA. Вышеупомянутая локализация также будет применяться к отправленному пользователю SMS-сообщению, содержащему код подтверждения.
Web
import { getAuth } from "firebase/auth"; const auth = getAuth(); auth.languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // auth.useDeviceLanguage();
Web
firebase.auth().languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
Используйте невидимую reCAPTCHA
Чтобы использовать невидимую reCAPTCHA, создайте объект RecaptchaVerifier
с параметром size
равным invisible
, указав идентификатор кнопки, которая отправляет вашу форму входа. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Используйте виджет reCAPTCHA
Чтобы использовать видимый виджет reCAPTCHA, создайте на своей странице элемент, содержащий виджет, а затем создайте объект RecaptchaVerifier
, указав при этом идентификатор контейнера. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {});
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');
Необязательно: укажите параметры reCAPTCHA.
При желании вы можете установить функции обратного вызова для объекта RecaptchaVerifier
, которые вызываются, когда пользователь решает reCAPTCHA или когда срок действия reCAPTCHA истекает до того, как пользователь отправит форму:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Необязательно: предварительная обработка reCAPTCHA
Если вы хотите предварительно отобразить reCAPTCHA перед отправкой запроса на вход, вызовите render
:
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
После разрешения render
вы получаете идентификатор виджета reCAPTCHA, который можно использовать для вызовов API reCAPTCHA :
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Отправьте код подтверждения на телефон пользователя
Чтобы инициировать вход по номеру телефона, предоставьте пользователю интерфейс, предлагающий ввести номер телефона, а затем вызовите функцию signInWithPhoneNumber
, чтобы запросить у Firebase отправку кода аутентификации на телефон пользователя по SMS:
Получите номер телефона пользователя.
Законодательные требования различаются, но в качестве передовой практики и для того, чтобы оправдать ожидания ваших пользователей, вам следует сообщить им, что если они используют вход в систему с помощью телефона, они могут получить SMS-сообщение для проверки, и применяются стандартные тарифы.
- Вызовите
signInWithPhoneNumber
, передав ему номер телефона пользователя и созданный ранееRecaptchaVerifier
.ЕслиWeb
import { getAuth, signInWithPhoneNumber } from "firebase/auth"; const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; const auth = getAuth(); signInWithPhoneNumber(auth, phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
Web
const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
signInWithPhoneNumber
приводит к ошибке, сбросьте reCAPTCHA, чтобы пользователь мог повторить попытку:grecaptcha.reset(window.recaptchaWidgetId); // Or, if you haven't stored the widget ID: window.recaptchaVerifier.render().then(function(widgetId) { grecaptcha.reset(widgetId); });
Метод signInWithPhoneNumber
выдает пользователю запрос reCAPTCHA, и если пользователь его принимает, запрашивает, чтобы Firebase Authentication отправила SMS-сообщение, содержащее код подтверждения, на телефон пользователя.
Войдите в систему с помощью проверочного кода.
После успешного вызова signInWithPhoneNumber
предложите пользователю ввести код подтверждения, полученный по SMS. Затем войдите в систему пользователя, передав код методу confirm
объекта ConfirmationResult
, который был передан обработчику выполнения signInWithPhoneNumber
(то есть then
блокированию). Например:
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Если вызов для confirm
удался, пользователь успешно вошел в систему.
Получите промежуточный объект AuthCredential.
Если вам нужно получить объект AuthCredential
для учетной записи пользователя, передайте код подтверждения из результата подтверждения и код подтверждения в PhoneAuthProvider.credential
вместо вызова confirm
:
var credential = firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, code);
Затем вы можете войти в систему с учетными данными:
firebase.auth().signInWithCredential(credential);
Тест с вымышленными телефонными номерами
Вы можете настроить вымышленные номера телефонов для разработки через консоль Firebase . Тестирование с использованием вымышленных телефонных номеров дает следующие преимущества:
- Проверьте аутентификацию номера телефона, не расходуя квоту использования.
- Проверьте аутентификацию номера телефона без отправки реального SMS-сообщения.
- Запускайте последовательные тесты с одним и тем же номером телефона без ограничений. Это сводит к минимуму риск отклонения во время проверки в магазине приложений, если рецензент использует для тестирования один и тот же номер телефона.
- Легко тестируйте в средах разработки без каких-либо дополнительных усилий, таких как возможность разработки в симуляторе iOS или эмуляторе Android без сервисов Google Play.
- Создавайте интеграционные тесты, не блокируясь проверками безопасности, которые обычно применяются к реальным телефонным номерам в производственной среде.
Вымышленные номера телефонов должны соответствовать следующим требованиям:
- Убедитесь, что вы используете номера телефонов, которые действительно вымышлены и еще не существуют. Firebase Authentication не позволяет вам устанавливать существующие номера телефонов, используемые реальными пользователями, в качестве тестовых номеров. Один из вариантов — использовать номера с префиксом 555 в качестве тестовых телефонных номеров в США, например: +1 650-555-3434.
- Номера телефонов должны быть правильно отформатированы с учетом длины и других ограничений. Они по-прежнему будут проходить ту же проверку, что и номер телефона реального пользователя.
- Для разработки можно добавить до 10 номеров телефонов.
- Используйте тестовые номера телефонов/коды, которые трудно угадать, и часто меняйте их.
Создавайте вымышленные номера телефонов и коды подтверждения.
- В консоли Firebase откройте раздел Аутентификация .
- На вкладке «Метод входа» включите поставщика услуг телефона, если вы еще этого не сделали.
- Откройте меню «Телефонные номера для тестирования аккордеона».
- Укажите номер телефона, который вы хотите протестировать, например: +1 650-555-3434 .
- Укажите шестизначный код подтверждения для этого конкретного номера, например: 654321 .
- Добавьте номер. Если есть необходимость, вы можете удалить номер телефона и его код, наведя курсор на соответствующую строку и нажав значок корзины.
Ручное тестирование
Вы можете сразу начать использовать вымышленный номер телефона в своем приложении. Это позволяет вам выполнять тестирование вручную на этапах разработки, не сталкиваясь с проблемами квот или регулирования. Вы также можете протестировать непосредственно из симулятора iOS или эмулятора Android без установки сервисов Google Play.
Когда вы указываете вымышленный номер телефона и отправляете код подтверждения, фактическое SMS-сообщение не отправляется. Вместо этого вам необходимо предоставить ранее настроенный код подтверждения для завершения входа.
После завершения входа в систему создается пользователь Firebase с этим номером телефона. Пользователь имеет то же поведение и свойства, что и пользователь реального номера телефона, и может получить доступ к Realtime Database / Cloud Firestore и другим сервисам таким же образом. Идентификационный токен, созданный во время этого процесса, имеет ту же подпись, что и реальный пользователь номера телефона.
Другой вариант — установить для этих пользователей тестовую роль с помощью пользовательских утверждений, чтобы отличать их от поддельных пользователей, если вы хотите дополнительно ограничить доступ.
Интеграционное тестирование
Помимо ручного тестирования, Firebase Authentication предоставляет API, помогающие писать интеграционные тесты для тестирования аутентификации по телефону. Эти API отключают проверку приложений, отключив требование reCAPTCHA в Интернете и автоматические push-уведомления в iOS. Это делает возможным автоматизированное тестирование в этих потоках и упрощает его реализацию. Кроме того, они помогают обеспечить возможность тестирования потоков мгновенной проверки на Android.
В веб-версии установите appVerificationDisabledForTesting
значение true
перед отрисовкой firebase.auth.RecaptchaVerifier
. Это автоматически разрешает reCAPTCHA, позволяя вам передать номер телефона, не разгадывая его вручную. Обратите внимание: даже несмотря на то, что reCAPTCHA отключена, использование невымышленного номера телефона по-прежнему не позволит завершить вход. С этим API можно использовать только вымышленные номера телефонов.
// Turn off phone auth app verification. firebase.auth().settings.appVerificationDisabledForTesting = true; var phoneNumber = "+16505554567"; var testVerificationCode = "123456"; // This will render a fake reCAPTCHA as appVerificationDisabledForTesting is true. // This will resolve after rendering without app verification. var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); // signInWithPhoneNumber will call appVerifier.verify() which will resolve with a fake // reCAPTCHA response. firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then(function (confirmationResult) { // confirmationResult can resolve with the fictional testVerificationCode above. return confirmationResult.confirm(testVerificationCode) }).catch(function (error) { // Error; SMS not sent // ... });
Видимые и невидимые средства проверки приложений reCAPTCHA ведут себя по-разному, когда проверка приложений отключена:
- Видимая reCAPTCHA : когда видимая reCAPTCHA отображается с помощью
appVerifier.render()
, она автоматически разрешается после задержки в доли секунды. Это эквивалентно тому, что пользователь нажимает reCAPTCHA сразу после рендеринга. Срок действия ответа reCAPTCHA истечет через некоторое время, а затем снова будет автоматически разрешен. - Невидимый reCAPTCHA : Невидимый reCAPTCHA не разрешается автоматически при рендеринге, а вместо этого делает это при вызове
appVerifier.verify()
или при нажатии привязки кнопки reCAPTCHA после задержки в доли секунды. Аналогично, срок действия ответа истечет через некоторое время и будет автоматически разрешен только после вызоваappVerifier.verify()
или при повторном нажатии привязки кнопки reCAPTCHA.
Всякий раз, когда разрешается ложная reCAPTCHA, соответствующая функция обратного вызова запускается, как и ожидалось, с поддельным ответом. Если также указан обратный вызов по истечении срока действия, он сработает по истечении срока действия.
Следующие шаги
После того, как пользователь входит в систему в первый раз, создается новая учетная запись пользователя, которая связывается с учетными данными (то есть именем пользователя и паролем, номером телефона или информацией поставщика аутентификации), с которыми пользователь вошел в систему. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя в каждом приложении вашего проекта, независимо от того, как пользователь входит в систему.
В ваших приложениях рекомендуемый способ узнать статус аутентификации вашего пользователя — установить наблюдателя на объекте
Auth
. Затем вы можете получить базовую информацию профиля пользователя из объектаUser
. См. Управление пользователями .В правилах безопасности Firebase Realtime Database и Cloud Storage Firebase вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
auth
и использовать его для управления тем, к каким данным пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Чтобы выйти из системы, вызовите signOut
:
Web
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Web
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Вы можете использовать Firebase Authentication для входа в систему, отправив SMS-сообщение на телефон пользователя. Пользователь авторизуется с помощью одноразового кода, содержащегося в SMS-сообщении.
Самый простой способ добавить вход в систему по номеру телефона в ваше приложение — использовать FirebaseUI , который включает в себя виджет входа в систему, реализующий потоки входа в систему для входа в систему по номеру телефона, а также вход на основе пароля и федеративный вход. В этом документе описывается, как реализовать процесс входа в систему по номеру телефона с помощью Firebase SDK.
Прежде чем начать
Если вы еще этого не сделали, скопируйте фрагмент инициализации из консоли Firebase в свой проект, как описано в разделе «Добавление Firebase в проект JavaScript» .Проблемы безопасности
Аутентификация с использованием только номера телефона хоть и удобна, но менее безопасна, чем другие доступные методы, поскольку владение номером телефона может легко передаваться между пользователями. Кроме того, на устройствах с несколькими профилями пользователей любой пользователь, который может получать SMS-сообщения, может войти в учетную запись, используя номер телефона устройства.
Если вы используете в своем приложении вход по номеру телефона, вам следует предлагать его наряду с более безопасными методами входа и информировать пользователей о компромиссах безопасности при использовании входа в систему по номеру телефона.
Включите вход по номеру телефона для вашего проекта Firebase
Чтобы войти в систему с помощью SMS, сначала необходимо включить метод входа по номеру телефона для вашего проекта Firebase:
- В консоли Firebase откройте раздел Аутентификация .
- На странице «Метод входа» включите метод входа по номеру телефона .
- Если на той же странице домен, на котором будет размещено ваше приложение, не указан в разделе Домены перенаправления OAuth , добавьте свой домен. Обратите внимание, что localhost не разрешен в качестве размещенного домена для аутентификации по телефону.
Настройте верификатор reCAPTCHA
Прежде чем вы сможете входить в систему пользователей с помощью их номеров телефонов, вам необходимо настроить средство проверки reCAPTCHA Firebase. Firebase использует reCAPTCHA для предотвращения злоупотреблений, например, гарантируя, что запрос на проверку номера телефона поступает из одного из разрешенных доменов вашего приложения.
Вам не нужно вручную настраивать клиент reCAPTCHA; когда вы используете объект RecaptchaVerifier
Firebase SDK, Firebase автоматически создает и обрабатывает все необходимые клиентские ключи и секреты.
Объект RecaptchaVerifier
поддерживает невидимый reCAPTCHA , который часто может проверять пользователя, не требуя каких-либо действий со стороны пользователя, а также виджет reCAPTCHA, который всегда требует взаимодействия с пользователем для успешного завершения.
Базовый отображаемый reCAPTCHA может быть локализован в соответствии с предпочтениями пользователя путем обновления языкового кода в экземпляре Auth перед отображением reCAPTCHA. Вышеупомянутая локализация также будет применяться к отправленному пользователю SMS-сообщению, содержащему код подтверждения.
Web
import { getAuth } from "firebase/auth"; const auth = getAuth(); auth.languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // auth.useDeviceLanguage();
Web
firebase.auth().languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
Используйте невидимую reCAPTCHA
Чтобы использовать невидимую reCAPTCHA, создайте объект RecaptchaVerifier
с параметром size
равным invisible
, указав идентификатор кнопки, которая отправляет вашу форму входа. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Используйте виджет reCAPTCHA
Чтобы использовать видимый виджет reCAPTCHA, создайте на своей странице элемент, содержащий виджет, а затем создайте объект RecaptchaVerifier
, указав при этом идентификатор контейнера. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {});
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');
Необязательно: укажите параметры reCAPTCHA.
При желании вы можете установить функции обратного вызова для объекта RecaptchaVerifier
, которые вызываются, когда пользователь решает reCAPTCHA или когда срок действия reCAPTCHA истекает до того, как пользователь отправит форму:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Необязательно: предварительная обработка reCAPTCHA
Если вы хотите предварительно отобразить reCAPTCHA перед отправкой запроса на вход, вызовите render
:
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
После разрешения render
вы получаете идентификатор виджета reCAPTCHA, который можно использовать для вызовов API reCAPTCHA :
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Отправьте код подтверждения на телефон пользователя
Чтобы инициировать вход по номеру телефона, предоставьте пользователю интерфейс, предлагающий ввести свой номер телефона, а затем вызовите signInWithPhoneNumber
, чтобы запросить у Firebase отправку кода аутентификации на телефон пользователя по SMS:
Получите номер телефона пользователя.
Законодательные требования различаются, но в качестве передовой практики и для того, чтобы оправдать ожидания ваших пользователей, вам следует сообщить им, что если они используют вход в систему с помощью телефона, они могут получить SMS-сообщение для проверки, и применяются стандартные тарифы.
- Вызовите
signInWithPhoneNumber
, передав ему номер телефона пользователя и созданный ранееRecaptchaVerifier
.ЕслиWeb
import { getAuth, signInWithPhoneNumber } from "firebase/auth"; const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; const auth = getAuth(); signInWithPhoneNumber(auth, phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
Web
const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
signInWithPhoneNumber
приводит к ошибке, сбросьте reCAPTCHA, чтобы пользователь мог повторить попытку:grecaptcha.reset(window.recaptchaWidgetId); // Or, if you haven't stored the widget ID: window.recaptchaVerifier.render().then(function(widgetId) { grecaptcha.reset(widgetId); });
Метод signInWithPhoneNumber
выдает пользователю запрос reCAPTCHA, и если пользователь его принимает, запрашивает, чтобы Firebase Authentication отправила SMS-сообщение, содержащее код подтверждения, на телефон пользователя.
Войдите в систему с помощью проверочного кода.
После успешного вызова signInWithPhoneNumber
предложите пользователю ввести код подтверждения, полученный по SMS. Затем войдите в систему, передав код методу confirm
объекта ConfirmationResult
, который был передан обработчику выполнения signInWithPhoneNumber
(то есть then
блокированию). Например:
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Если вызов для confirm
удался, пользователь успешно вошел в систему.
Получите промежуточный объект AuthCredential.
Если вам нужно получить объект AuthCredential
для учетной записи пользователя, передайте код подтверждения из результата подтверждения и код подтверждения в PhoneAuthProvider.credential
вместо вызова confirm
:
var credential = firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, code);
Затем вы можете войти в систему с учетными данными:
firebase.auth().signInWithCredential(credential);
Тест с вымышленными телефонными номерами
Вы можете настроить вымышленные номера телефонов для разработки через консоль Firebase . Тестирование с использованием вымышленных телефонных номеров дает следующие преимущества:
- Проверьте аутентификацию номера телефона, не расходуя квоту использования.
- Проверьте аутентификацию номера телефона без отправки реального SMS-сообщения.
- Запускайте последовательные тесты с одним и тем же номером телефона без ограничений. Это сводит к минимуму риск отклонения во время проверки в магазине приложений, если рецензент использует для тестирования один и тот же номер телефона.
- Легко тестируйте в средах разработки без каких-либо дополнительных усилий, таких как возможность разработки в симуляторе iOS или эмуляторе Android без сервисов Google Play.
- Создавайте интеграционные тесты, не блокируясь проверками безопасности, которые обычно применяются к реальным телефонным номерам в производственной среде.
Вымышленные номера телефонов должны соответствовать следующим требованиям:
- Убедитесь, что вы используете номера телефонов, которые действительно вымышлены и еще не существуют. Firebase Authentication не позволяет вам устанавливать существующие номера телефонов, используемые реальными пользователями, в качестве тестовых номеров. Один из вариантов — использовать номера с префиксом 555 в качестве тестовых телефонных номеров в США, например: +1 650-555-3434.
- Номера телефонов должны быть правильно отформатированы с учетом длины и других ограничений. Они по-прежнему будут проходить ту же проверку, что и номер телефона реального пользователя.
- Для разработки можно добавить до 10 номеров телефонов.
- Используйте тестовые номера телефонов/коды, которые трудно угадать, и часто меняйте их.
Создавайте вымышленные номера телефонов и коды подтверждения.
- В консоли Firebase откройте раздел Аутентификация .
- На вкладке «Метод входа» включите поставщика услуг телефона, если вы еще этого не сделали.
- Откройте меню «Телефонные номера для тестирования аккордеона».
- Укажите номер телефона, который вы хотите протестировать, например: +1 650-555-3434 .
- Укажите шестизначный код подтверждения для этого конкретного номера, например: 654321 .
- Добавьте номер. Если есть необходимость, вы можете удалить номер телефона и его код, наведя курсор на соответствующую строку и нажав значок корзины.
Ручное тестирование
Вы можете сразу начать использовать вымышленный номер телефона в своем приложении. Это позволяет вам выполнять тестирование вручную на этапах разработки, не сталкиваясь с проблемами квот или регулирования. Вы также можете протестировать непосредственно из симулятора iOS или эмулятора Android без установки сервисов Google Play.
Когда вы указываете вымышленный номер телефона и отправляете код подтверждения, фактическое SMS-сообщение не отправляется. Вместо этого вам необходимо предоставить ранее настроенный код подтверждения для завершения входа.
После завершения входа в систему создается пользователь Firebase с этим номером телефона. Пользователь имеет то же поведение и свойства, что и пользователь реального номера телефона, и может получить доступ к Realtime Database / Cloud Firestore и другим сервисам таким же образом. Идентификационный токен, созданный во время этого процесса, имеет ту же подпись, что и реальный пользователь номера телефона.
Другой вариант — установить для этих пользователей тестовую роль с помощью пользовательских утверждений, чтобы отличать их от поддельных пользователей, если вы хотите дополнительно ограничить доступ.
Интеграционное тестирование
Помимо ручного тестирования, Firebase Authentication предоставляет API, помогающие писать интеграционные тесты для тестирования аутентификации по телефону. Эти API отключают проверку приложений, отключив требование reCAPTCHA в Интернете и автоматические push-уведомления в iOS. Это делает возможным автоматизированное тестирование в этих потоках и упрощает его реализацию. Кроме того, они помогают обеспечить возможность тестирования потоков мгновенной проверки на Android.
В веб-версии установите appVerificationDisabledForTesting
значение true
перед отрисовкой firebase.auth.RecaptchaVerifier
. Это автоматически разрешает reCAPTCHA, позволяя вам передать номер телефона, не разгадывая его вручную. Обратите внимание: даже несмотря на то, что reCAPTCHA отключена, использование невымышленного номера телефона по-прежнему не позволит завершить вход. С этим API можно использовать только вымышленные номера телефонов.
// Turn off phone auth app verification. firebase.auth().settings.appVerificationDisabledForTesting = true; var phoneNumber = "+16505554567"; var testVerificationCode = "123456"; // This will render a fake reCAPTCHA as appVerificationDisabledForTesting is true. // This will resolve after rendering without app verification. var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); // signInWithPhoneNumber will call appVerifier.verify() which will resolve with a fake // reCAPTCHA response. firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then(function (confirmationResult) { // confirmationResult can resolve with the fictional testVerificationCode above. return confirmationResult.confirm(testVerificationCode) }).catch(function (error) { // Error; SMS not sent // ... });
Видимые и невидимые средства проверки приложений reCAPTCHA ведут себя по-разному, когда проверка приложений отключена:
- Видимая reCAPTCHA : когда видимая reCAPTCHA отображается с помощью
appVerifier.render()
, она автоматически разрешается после задержки в доли секунды. Это эквивалентно тому, что пользователь нажимает reCAPTCHA сразу после рендеринга. Срок действия ответа reCAPTCHA истечет через некоторое время, а затем снова будет автоматически разрешен. - Невидимый reCAPTCHA : Невидимый reCAPTCHA не разрешается автоматически при рендеринге, а вместо этого делает это при вызове
appVerifier.verify()
или при нажатии привязки кнопки reCAPTCHA после задержки в доли секунды. Аналогично, срок действия ответа истечет через некоторое время и будет автоматически разрешен только после вызоваappVerifier.verify()
или при повторном нажатии привязки кнопки reCAPTCHA.
Всякий раз, когда разрешается ложная reCAPTCHA, соответствующая функция обратного вызова запускается, как и ожидалось, с поддельным ответом. Если также указан обратный вызов по истечении срока действия, он сработает по истечении срока действия.
Следующие шаги
После того, как пользователь входит в систему в первый раз, создается новая учетная запись пользователя, которая связывается с учетными данными (то есть именем пользователя и паролем, номером телефона или информацией поставщика аутентификации), с которыми пользователь вошел в систему. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя в каждом приложении вашего проекта, независимо от того, как пользователь входит в систему.
В ваших приложениях рекомендуемый способ узнать статус аутентификации вашего пользователя — установить наблюдателя на объекте
Auth
. Затем вы можете получить базовую информацию профиля пользователя из объектаUser
. См. Управление пользователями .В правилах безопасности Firebase Realtime Database и Cloud Storage Firebase вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
auth
и использовать его для управления тем, к каким данным пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Чтобы выйти из системы, вызовите signOut
:
Web
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Web
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Вы можете использовать Firebase Authentication для входа в систему, отправив SMS-сообщение на телефон пользователя. Пользователь авторизуется с помощью одноразового кода, содержащегося в SMS-сообщении.
Самый простой способ добавить вход в систему по номеру телефона в ваше приложение — использовать FirebaseUI , который включает в себя раскрывающийся виджет входа в систему, который реализует потоки входа в систему для входа в систему по номеру телефона, а также вход на основе пароля и федеративный вход. В этом документе описывается, как реализовать процесс входа в систему по номеру телефона с помощью Firebase SDK.
Прежде чем начать
Если вы еще этого не сделали, скопируйте фрагмент инициализации из консоли Firebase в свой проект, как описано в разделе Добавление Firebase в проект JavaScript .Проблемы безопасности
Аутентификация с использованием только номера телефона хоть и удобна, но менее безопасна, чем другие доступные методы, поскольку владение номером телефона может легко передаваться между пользователями. Кроме того, на устройствах с несколькими профилями пользователей любой пользователь, который может получать SMS-сообщения, может войти в учетную запись, используя номер телефона устройства.
Если вы используете в своем приложении вход по номеру телефона, вам следует предлагать его наряду с более безопасными методами входа и информировать пользователей о компромиссах безопасности при использовании входа в систему по номеру телефона.
Включите вход по номеру телефона для вашего проекта Firebase
Чтобы войти в систему с помощью SMS, сначала необходимо включить метод входа по номеру телефона для вашего проекта Firebase:
- В консоли Firebase откройте раздел Аутентификация .
- На странице «Метод входа» включите метод входа по номеру телефона .
- Если на той же странице домен, на котором будет размещено ваше приложение, не указан в разделе Домены перенаправления OAuth , добавьте свой домен. Обратите внимание, что localhost не разрешен в качестве размещенного домена для аутентификации по телефону.
Настройте верификатор reCAPTCHA
Прежде чем вы сможете входить в систему пользователей с помощью их номеров телефонов, вам необходимо настроить средство проверки reCAPTCHA Firebase. Firebase использует reCAPTCHA для предотвращения злоупотреблений, например, гарантируя, что запрос на проверку номера телефона поступает из одного из разрешенных доменов вашего приложения.
Вам не нужно вручную настраивать клиент reCAPTCHA; когда вы используете объект RecaptchaVerifier
Firebase SDK, Firebase автоматически создает и обрабатывает все необходимые клиентские ключи и секреты.
Объект RecaptchaVerifier
поддерживает невидимую reCAPTCHA , которая часто может проверять пользователя, не требуя каких-либо действий со стороны пользователя, а также виджет reCAPTCHA, который всегда требует взаимодействия с пользователем для успешного завершения.
Базовый отображаемый reCAPTCHA может быть локализован в соответствии с предпочтениями пользователя путем обновления языкового кода в экземпляре Auth перед отображением reCAPTCHA. Вышеупомянутая локализация также будет применяться к отправленному пользователю SMS-сообщению, содержащему код подтверждения.
Web
import { getAuth } from "firebase/auth"; const auth = getAuth(); auth.languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // auth.useDeviceLanguage();
Web
firebase.auth().languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
Используйте невидимую reCAPTCHA
Чтобы использовать невидимую reCAPTCHA, создайте объект RecaptchaVerifier
с параметром size
, установленным на invisible
, указав идентификатор кнопки, которая отправляет вашу форму входа. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Используйте виджет reCAPTCHA
Чтобы использовать видимый виджет reCAPTCHA, создайте на своей странице элемент, содержащий виджет, а затем создайте объект RecaptchaVerifier
, указав при этом идентификатор контейнера. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {});
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');
Необязательно: укажите параметры reCAPTCHA.
При желании вы можете установить функции обратного вызова для объекта RecaptchaVerifier
, которые вызываются, когда пользователь решает reCAPTCHA или когда срок действия reCAPTCHA истекает до того, как пользователь отправит форму:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Необязательно: предварительная обработка reCAPTCHA
Если вы хотите предварительно отобразить reCAPTCHA перед отправкой запроса на вход, вызовите render
:
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
После разрешения render
вы получаете идентификатор виджета reCAPTCHA, который можно использовать для вызовов API reCAPTCHA :
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Отправьте код подтверждения на телефон пользователя
Чтобы инициировать вход по номеру телефона, предоставьте пользователю интерфейс, предлагающий ввести номер телефона, а затем вызовите функцию signInWithPhoneNumber
, чтобы запросить у Firebase отправку кода аутентификации на телефон пользователя по SMS:
Получите номер телефона пользователя.
Законодательные требования различаются, но в качестве передовой практики и для того, чтобы оправдать ожидания ваших пользователей, вам следует сообщить им, что если они используют вход в систему с помощью телефона, они могут получить SMS-сообщение для проверки, и применяются стандартные тарифы.
- Вызовите
signInWithPhoneNumber
, передав ему номер телефона пользователя и созданный ранееRecaptchaVerifier
.ЕслиWeb
import { getAuth, signInWithPhoneNumber } from "firebase/auth"; const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; const auth = getAuth(); signInWithPhoneNumber(auth, phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
Web
const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
signInWithPhoneNumber
приводит к ошибке, сбросьте reCAPTCHA, чтобы пользователь мог повторить попытку:grecaptcha.reset(window.recaptchaWidgetId); // Or, if you haven't stored the widget ID: window.recaptchaVerifier.render().then(function(widgetId) { grecaptcha.reset(widgetId); });
Метод signInWithPhoneNumber
выдает пользователю запрос reCAPTCHA, и если пользователь его принимает, запрашивает, чтобы Firebase Authentication отправила SMS-сообщение, содержащее код подтверждения, на телефон пользователя.
Войдите в систему с помощью проверочного кода.
После успешного вызова signInWithPhoneNumber
предложите пользователю ввести код подтверждения, полученный по SMS. Затем войдите в систему пользователя, передав код методу confirm
объекта ConfirmationResult
, который был передан обработчику выполнения signInWithPhoneNumber
(то есть then
блокированию). Например:
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Если вызов для confirm
удался, пользователь успешно вошел в систему.
Получите промежуточный объект AuthCredential.
Если вам нужно получить объект AuthCredential
для учетной записи пользователя, передайте код подтверждения из результата подтверждения и код подтверждения в PhoneAuthProvider.credential
вместо вызова confirm
:
var credential = firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, code);
Затем вы можете войти в систему с учетными данными:
firebase.auth().signInWithCredential(credential);
Тест с вымышленными телефонными номерами
Вы можете настроить вымышленные номера телефонов для разработки через консоль Firebase . Тестирование с использованием вымышленных телефонных номеров дает следующие преимущества:
- Проверьте аутентификацию номера телефона, не расходуя квоту использования.
- Проверьте аутентификацию номера телефона без отправки реального SMS-сообщения.
- Запускайте последовательные тесты с одним и тем же номером телефона без ограничений. Это сводит к минимуму риск отклонения во время проверки в магазине приложений, если рецензент использует для тестирования один и тот же номер телефона.
- Легко тестируйте в средах разработки без каких-либо дополнительных усилий, таких как возможность разработки в симуляторе iOS или эмуляторе Android без сервисов Google Play.
- Напишите интеграционные тесты без блокировки проверки безопасности, обычно применяемые на реальных телефонных номерах в производственной среде.
Вымышленные номера телефонов должны соответствовать этим требованиям:
- Убедитесь, что вы используете телефонные номера, которые действительно являются вымышленными, и еще не существует. Firebase Authentication не позволяет вам устанавливать существующие номера телефонов, используемые реальными пользователями в качестве тестовых номеров. Одним из вариантов является использование 555 префиксных номеров в качестве тестовых телефонов США, например: +1 650-555-3434
- Телефонные номера должны быть правильно отформатированы для длины и других ограничений. Они по -прежнему будут проходить ту же валидацию, что и номер телефона реального пользователя.
- Вы можете добавить до 10 телефонов для разработки.
- Используйте тестовые телефоны/коды, которые трудно угадать и менять их часто.
Создать вымышленные телефоны и коды проверки
- В консоли Firebase откройте раздел аутентификации .
- На вкладке «Метод выхода» включите поставщика телефона, если вы еще этого не сделали.
- Откройте телефонные номера для тестирования меню аккордеона.
- Предоставьте номер телефона, который вы хотите проверить, например: +1 650-555-3434 .
- Укажите 6-значный код проверки для этого конкретного числа, например: 654321 .
- Добавьте номер. Если есть необходимость, вы можете удалить номер телефона и его код, парят над соответствующей строкой и щелкнув значок мусора.
Ручное тестирование
Вы можете напрямую начать использовать вымышленный номер телефона в вашем приложении. Это позволяет вам выполнять ручное тестирование на стадии разработки, не сталкиваясь с проблемами квот или дросселизмом. Вы также можете проверить непосредственно из симулятора iOS или эмулятора Android без установленных служб Google Play.
Когда вы предоставляете вымышленный номер телефона и отправляете код проверки, фактические SMS не отправляются. Вместо этого вам необходимо предоставить ранее настроенный код проверки для завершения регистрации.
При завершении регистрации пользователь Firebase создается с этим номером телефона. Пользователь обладает тем же поведением и свойствами, что и настоящий пользователь номера телефона, и может таким же образом получить доступ к Realtime Database / Cloud Firestore и других сервисах. Токен идентификатора, отказанный во время этого процесса, имеет такую же подпись, что и настоящий пользователь номера телефона.
Другой вариант - установить тестовую роль с помощью пользовательских претензий на этих пользователей, чтобы дифференцировать их как фальшивых пользователей, если вы хотите дополнительно ограничить доступ.
Интеграционное тестирование
В дополнение к ручным тестированию, Firebase Authentication предоставляет API, которые помогут записать интеграционные тесты для тестирования на автобусную работу. Эти API отключают проверку приложений, отключив требование RecAptcha в веб -и безмолвном тошке уведомлений в iOS. Это делает возможным тестирование автоматизации в этих потоках и легче реализовать. Кроме того, они помогают обеспечить возможность тестировать мгновенные потоки проверки на Android.
В Интернете установите appVerificationDisabledForTesting
tor true
, прежде чем отображать firebase.auth.RecaptchaVerifier
. Это автоматически разрешает Recaptcha, позволяя вам передавать номер телефона без ручного решения. Обратите внимание, что, несмотря на то, что Recaptcha отключена, использование необычного номера телефона все равно не сможет завершить войти. С этим API можно использовать только вымышленные номера телефонов.
// Turn off phone auth app verification. firebase.auth().settings.appVerificationDisabledForTesting = true; var phoneNumber = "+16505554567"; var testVerificationCode = "123456"; // This will render a fake reCAPTCHA as appVerificationDisabledForTesting is true. // This will resolve after rendering without app verification. var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); // signInWithPhoneNumber will call appVerifier.verify() which will resolve with a fake // reCAPTCHA response. firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then(function (confirmationResult) { // confirmationResult can resolve with the fictional testVerificationCode above. return confirmationResult.confirm(testVerificationCode) }).catch(function (error) { // Error; SMS not sent // ... });
Видимые и невидимые проверки приложений для макета ведут себя по -разному, когда проверка приложения отключена:
- Видимый Recaptcha : когда видимая recaptcha отображается через
appVerifier.render()
, он автоматически разрешается после доли второй задержки. Это эквивалентно пользователю, щелкнувшему по рекапте сразу после рендеринга. Ответ Recaptcha истекает через некоторое время, а затем снова автозаправлена. - Invisible recaptcha : невидимая recaptcha не является автоматической разрешением при рендеринге и вместо этого делает это на вызове
appVerifier.verify()
или когда кнопка привязки recaptcha нажимается после доли второй задержки. Точно так же ответ истекает через некоторое время и будет автоматической разрешением либо после вызоваappVerifier.verify()
, либо когда кнопка привязки кнопки RecAptcha снова нажимается.
Всякий раз, когда решается макет Recaptcha, соответствующая функция обратного вызова запускается, как и ожидалось, при фальшивом ответе. Если также указан вызов срока действия, он вызовет срок действия.
Следующие шаги
После того, как пользователь вступил в первый раз, новая учетная запись пользователя создается и связана с учетными данными, то есть именем пользователя и паролем, номером телефона или информацией по провайдеру Auth - вписался пользователь. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя в каждом приложении в вашем проекте, независимо от того, как входит пользователь.
В ваших приложениях рекомендуемый способ узнать статус автоаты вашего пользователя - установить наблюдателя на объекте
Auth
. Затем вы можете получить базовую информацию о профиле пользователя отUser
объекта. См. Управление пользователями .В вашей Firebase Realtime Database и правилах безопасности Cloud Storage вы можете получить уникальный идентификатор пользователя пользователя с переменной
auth
и использовать его для управления тем, к каким данным может получить доступ пользователь.
Вы можете позволить пользователям войти в ваше приложение, используя несколько поставщиков аутентификации, связывая учетные данные по провайдеру Auth с существующей учетной записью пользователя.
Чтобы подписать пользователя, вызовите signOut
:
Web
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Web
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Вы можете использовать Firebase Authentication , чтобы ввести пользователя, отправив SMS -сообщение на телефон пользователя. Пользователь включает в себя одноразовый код, содержащийся в сообщении SMS.
Самый простой способ добавить в систему номера телефона в ваше приложение-использовать Firebaseui , который включает в себя виджет входа в систему, который реализует потоки входа для входа номера телефона, а также на основе паролей и федерального входа. В этом документе описывается, как реализовать поток регистрации номера телефона, используя SDK Firebase.
Прежде чем начать
Если вы еще этого не сделали, скопируйте фрагмент инициализации из консоли Firebase в ваш проект, как описано в Add Firebase в ваш проект JavaScript .Проблемы безопасности
Аутентификация с использованием только номера телефона, хотя и удобно, менее безопасна, чем другие доступные методы, потому что владение номером телефона может быть легко передано между пользователями. Кроме того, на устройствах с несколькими профилями пользователей любой пользователь, который может получать SMS -сообщения, может войти в учетную запись, используя номер телефона устройства.
Если вы используете вход на основе номера телефона в своем приложении, вы должны предложить его вместе с более безопасными методами входа и информировать пользователей об компромиссах безопасности использования входа номера телефона.
Включите вход номера телефона для вашего проекта Firebase
Чтобы подписать пользователей с помощью SMS, вы должны сначала включить метод входа номера телефона для вашего проекта Firebase:
- В консоли Firebase откройте раздел аутентификации .
- На странице метода входа включите метод регистрации номера телефона .
- На той же странице, если домен, в котором будет размещено приложение, не указан в разделе доменов перенаправления OAuth , добавьте свой домен. Обратите внимание, что Localhost не допускается в качестве размещенного домена для целей телефона.
Установите проверку Recaptcha
Прежде чем вы сможете подписать пользователей с их номерами телефонов, вы должны настроить проверку Firebase Recaptcha. Firebase использует Recaptcha для предотвращения злоупотреблений, например, путем обеспечения того, чтобы запрос на проверку номера телефона поступал из одного из доменов вашего приложения.
Вам не нужно вручную настраивать клиента Recaptcha; Когда вы используете объект Firebase SDK RecaptchaVerifier
, Firebase автоматически создает и обрабатывает любые необходимые ключи клиента и секреты.
Объект RecaptchaVerifier
поддерживает невидимый recaptcha , который часто может проверять пользователя, не требуя каких -либо действий пользователя, а также виджета Recaptcha, который всегда требует успешного взаимодействия пользователя.
Основная визуализация recaptcha может быть локализована в предпочтениях пользователя путем обновления языкового кода на экземпляре AUTH до рендеринга recaptcha. Вышеупомянутая локализация также будет применяться к сообщению SMS, отправленному пользователю, содержащему код проверки.
Web
import { getAuth } from "firebase/auth"; const auth = getAuth(); auth.languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // auth.useDeviceLanguage();
Web
firebase.auth().languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
Используйте невидимую recaptcha
Чтобы использовать невидимый Recaptcha, создайте объект RecaptchaVerifier
с параметром size
, установленным для invisible
, указав идентификатор кнопки, которая подчиняет вашу форму входа. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('sign-in-button', { 'size': 'invisible', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. onSignInSubmit(); } });
Используйте виджет Recaptcha
Чтобы использовать видимый виджет Recaptcha, создайте элемент на вашей странице, чтобы сдержать виджет, а затем создайте объект RecaptchaVerifier
, указав идентификатор контейнера, когда вы это сделаете. Например:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', {});
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container');
Необязательно: укажите параметры recaptcha
При желании вы можете установить функции обратного вызова в объекте RecaptchaVerifier
, который вызывается, когда пользователь решает RecAptcha или recaptcha истекает, прежде чем пользователь подарит форму:
Web
import { getAuth, RecaptchaVerifier } from "firebase/auth"; const auth = getAuth(); window.recaptchaVerifier = new RecaptchaVerifier(auth, 'recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Web
window.recaptchaVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container', { 'size': 'normal', 'callback': (response) => { // reCAPTCHA solved, allow signInWithPhoneNumber. // ... }, 'expired-callback': () => { // Response expired. Ask user to solve reCAPTCHA again. // ... } });
Необязательно: предварительно оказать recaptcha
Если вы хотите предварительно подать recaptcha перед отправкой запроса входа, позвоните в render
:
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
Web
recaptchaVerifier.render().then((widgetId) => { window.recaptchaWidgetId = widgetId; });
После разрешения render
вы получаете идентификатор виджета Recaptcha, который вы можете использовать для вызовов в API Recaptcha :
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Web
const recaptchaResponse = grecaptcha.getResponse(recaptchaWidgetId);
Отправить проверку на телефон пользователя
Чтобы инициировать вход номера телефона, представьте пользователю интерфейс, который побуждает его предоставить свой номер телефона, а затем вызовите signInWithPhoneNumber
, чтобы запросить, чтобы FireBase отправил код аутентификации на телефон пользователя по SMS:
Получите номер телефона пользователя.
Требования к правовым требованиям различаются, но в качестве лучшей практики и для установления ожиданий для ваших пользователей вы должны сообщить им, что если они используют вход телефона, они могут получить SMS-сообщение для проверки и применяемых стандартных ставок.
- Позвоните в
signInWithPhoneNumber
, передав ему номер телефона пользователя иRecaptchaVerifier
вы создали ранее.ЕслиWeb
import { getAuth, signInWithPhoneNumber } from "firebase/auth"; const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; const auth = getAuth(); signInWithPhoneNumber(auth, phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
Web
const phoneNumber = getPhoneNumberFromUserInput(); const appVerifier = window.recaptchaVerifier; firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then((confirmationResult) => { // SMS sent. Prompt user to type the code from the message, then sign the // user in with confirmationResult.confirm(code). window.confirmationResult = confirmationResult; // ... }).catch((error) => { // Error; SMS not sent // ... });
signInWithPhoneNumber
приведет к ошибке, сбросьте Recaptcha, чтобы пользователь мог попробовать еще раз:grecaptcha.reset(window.recaptchaWidgetId); // Or, if you haven't stored the widget ID: window.recaptchaVerifier.render().then(function(widgetId) { grecaptcha.reset(widgetId); });
Метод signInWithPhoneNumber
выпускает задачу recaptcha для пользователя, и если пользователь передает задачу, запрашивает, что Firebase Authentication отправляет SMS -сообщение, содержащее проверенный код на телефон пользователя.
Войдите в пользователя с кодом проверки
После того, как призыв к signInWithPhoneNumber
преуспеет, предложите пользователю ввести код проверки, полученную SMS. Затем войдите в пользователя, передавая код в метод confirm
объекта ConfirmationResult
, который был передан обработчику выполнения signInWithPhoneNumber
(то есть его then
блок). Например:
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Web
const code = getCodeFromUserInput(); confirmationResult.confirm(code).then((result) => { // User signed in successfully. const user = result.user; // ... }).catch((error) => { // User couldn't sign in (bad verification code?) // ... });
Если вызов для confirm
преуспел, пользователь успешно вписался.
Получите средний объект Authcredential
Если вам нужно получить объект AuthCredential
для учетной записи пользователя, передайте код проверки из результата подтверждения и код проверки в PhoneAuthProvider.credential
вместо вызова confirm
:
var credential = firebase.auth.PhoneAuthProvider.credential(confirmationResult.verificationId, code);
Затем вы можете войти в пользователя с учетными данными:
firebase.auth().signInWithCredential(credential);
Проверка с вымышленными номерами телефонов
Вы можете настроить вымышленные телефоны для разработки через консоль Firebase . Тестирование с вымышленными номерами телефонов дает эти преимущества:
- Тестируйте аутентификацию телефона, не потребляя квоту использования.
- Тестируйте аутентификацию номера телефона без отправки фактического SMS -сообщения.
- Запустите последовательные тесты с тем же номером телефона, не запускаясь. Это сводит к минимуму риск отклонения в процессе проверки App Store, если рецензент использует тот же номер телефона для тестирования.
- Легко тестируйте в средах разработки без каких -либо дополнительных усилий, таких как возможность разработки в симуляторе iOS или эмулятор Android без служб Google Play.
- Напишите интеграционные тесты без блокировки проверки безопасности, обычно применяемые на реальных телефонных номерах в производственной среде.
Вымышленные номера телефонов должны соответствовать этим требованиям:
- Убедитесь, что вы используете телефонные номера, которые действительно являются вымышленными, и еще не существует. Firebase Authentication не позволяет вам устанавливать существующие номера телефонов, используемые реальными пользователями в качестве тестовых номеров. Одним из вариантов является использование 555 префиксных номеров в качестве тестовых телефонов США, например: +1 650-555-3434
- Телефонные номера должны быть правильно отформатированы для длины и других ограничений. Они по -прежнему будут проходить ту же валидацию, что и номер телефона реального пользователя.
- Вы можете добавить до 10 телефонов для разработки.
- Используйте тестовые телефоны/коды, которые трудно угадать и менять их часто.
Создать вымышленные телефоны и коды проверки
- В консоли Firebase откройте раздел аутентификации .
- На вкладке «Метод выхода» включите поставщика телефона, если вы еще этого не сделали.
- Откройте телефонные номера для тестирования меню аккордеона.
- Предоставьте номер телефона, который вы хотите проверить, например: +1 650-555-3434 .
- Укажите 6-значный код проверки для этого конкретного числа, например: 654321 .
- Добавьте номер. Если есть необходимость, вы можете удалить номер телефона и его код, парят над соответствующей строкой и щелкнув значок мусора.
Ручное тестирование
Вы можете напрямую начать использовать вымышленный номер телефона в вашем приложении. Это позволяет вам выполнять ручное тестирование на стадии разработки, не сталкиваясь с проблемами квот или дросселизмом. Вы также можете проверить непосредственно из симулятора iOS или эмулятора Android без установленных служб Google Play.
Когда вы предоставляете вымышленный номер телефона и отправляете код проверки, фактические SMS не отправляются. Вместо этого вам необходимо предоставить ранее настроенный код проверки для завершения регистрации.
При завершении регистрации пользователь Firebase создается с этим номером телефона. Пользователь обладает тем же поведением и свойствами, что и настоящий пользователь номера телефона, и может таким же образом получить доступ к Realtime Database / Cloud Firestore и других сервисах. Токен идентификатора, отказанный во время этого процесса, имеет такую же подпись, что и настоящий пользователь номера телефона.
Другой вариант - установить тестовую роль с помощью пользовательских претензий на этих пользователей, чтобы дифференцировать их как фальшивых пользователей, если вы хотите дополнительно ограничить доступ.
Интеграционное тестирование
В дополнение к ручным тестированию, Firebase Authentication предоставляет API, которые помогут записать интеграционные тесты для тестирования на автобусную работу. Эти API отключают проверку приложений, отключив требование RecAptcha в веб -и безмолвном тошке уведомлений в iOS. Это делает возможным тестирование автоматизации в этих потоках и легче реализовать. Кроме того, они помогают обеспечить возможность тестировать мгновенные потоки проверки на Android.
В Интернете установите appVerificationDisabledForTesting
tor true
, прежде чем отображать firebase.auth.RecaptchaVerifier
. Это автоматически разрешает Recaptcha, позволяя вам передавать номер телефона без ручного решения. Обратите внимание, что, несмотря на то, что Recaptcha отключена, использование необычного номера телефона все равно не сможет завершить войти. С этим API можно использовать только вымышленные номера телефонов.
// Turn off phone auth app verification. firebase.auth().settings.appVerificationDisabledForTesting = true; var phoneNumber = "+16505554567"; var testVerificationCode = "123456"; // This will render a fake reCAPTCHA as appVerificationDisabledForTesting is true. // This will resolve after rendering without app verification. var appVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); // signInWithPhoneNumber will call appVerifier.verify() which will resolve with a fake // reCAPTCHA response. firebase.auth().signInWithPhoneNumber(phoneNumber, appVerifier) .then(function (confirmationResult) { // confirmationResult can resolve with the fictional testVerificationCode above. return confirmationResult.confirm(testVerificationCode) }).catch(function (error) { // Error; SMS not sent // ... });
Видимые и невидимые проверки приложений для макета ведут себя по -разному, когда проверка приложения отключена:
- Видимый Recaptcha : когда видимая recaptcha отображается через
appVerifier.render()
, он автоматически разрешается после доли второй задержки. Это эквивалентно пользователю, щелкнувшему по рекапте сразу после рендеринга. Ответ Recaptcha истекает через некоторое время, а затем снова автозаправлена. - Invisible recaptcha : невидимая recaptcha не является автоматической разрешением при рендеринге и вместо этого делает это на вызове
appVerifier.verify()
или когда кнопка привязки recaptcha нажимается после доли второй задержки. Точно так же ответ истекает через некоторое время и будет автоматической разрешением либо после вызоваappVerifier.verify()
, либо когда кнопка привязки кнопки RecAptcha снова нажимается.
Всякий раз, когда решается макет Recaptcha, соответствующая функция обратного вызова запускается, как и ожидалось, при фальшивом ответе. Если также указан вызов срока действия, он вызовет срок действия.
Следующие шаги
После того, как пользователь вступил в первый раз, новая учетная запись пользователя создается и связана с учетными данными, то есть именем пользователя и паролем, номером телефона или информацией по провайдеру Auth - вписался пользователь. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя в каждом приложении в вашем проекте, независимо от того, как входит пользователь.
В ваших приложениях рекомендуемый способ узнать статус автоаты вашего пользователя - установить наблюдателя на объекте
Auth
. Затем вы можете получить базовую информацию о профиле пользователя отUser
объекта. См. Управление пользователями .В вашей Firebase Realtime Database и правилах безопасности Cloud Storage вы можете получить уникальный идентификатор пользователя пользователя с переменной
auth
и использовать его для управления тем, к каким данным может получить доступ пользователь.
Вы можете позволить пользователям войти в ваше приложение, используя несколько поставщиков аутентификации, связывая учетные данные по провайдеру Auth с существующей учетной записью пользователя.
Чтобы подписать пользователя, вызовите signOut
:
Web
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
Web
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });