Подключите свое приложение к эмулятору аутентификации

Прежде чем использовать эмулятор аутентификации в своем приложении, убедитесь, что вы понимаете общий рабочий процесс Firebase Local Emulator Suite , а также что вы устанавливаете и настраиваете Local Emulator Suite и проверяете его команды интерфейса командной строки .

В этом разделе предполагается, что вы уже знакомы с разработкой решений Firebase Authentication для производства. При необходимости просмотрите документацию по сочетанию платформы и метода проверки подлинности .

Что я могу сделать с эмулятором аутентификации?

Эмулятор аутентификации обеспечивает высокоточную локальную эмуляцию сервисов Firebase Authentication, предоставляя большую часть функций, имеющихся в рабочей версии Firebase Authentication . В сочетании с платформами Apple, Android и Web Firebase SDK эмулятор позволяет:

  • Создавайте, обновляйте и управляйте эмулированными учетными записями пользователей для тестирования электронной почты/пароля, номера телефона/SMS, многофакторной проверки подлинности SMS и аутентификации стороннего поставщика удостоверений (например, Google).
  • Просмотр и редактирование эмулируемых пользователей
  • Прототип систем аутентификации с пользовательскими токенами
  • Проверьте сообщения, связанные с проверкой подлинности, на вкладке Журналы пользовательского интерфейса эмулятора.

Выберите проект Firebase

Firebase Local Emulator Suite эмулирует продукты для одного проекта Firebase.

Чтобы выбрать проект для использования, перед запуском эмуляторов в CLI запустите firebase use в своем рабочем каталоге. Или вы можете передать флаг --project каждой команде эмулятора.

Local Emulator Suite поддерживает эмуляцию реальных проектов Firebase и демонстрационных проектов.

Тип проекта Функции Использование с эмуляторами
Настоящий

Настоящий проект Firebase — это тот, который вы создали и настроили (скорее всего, через консоль Firebase).

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

При работе с реальными проектами Firebase вы можете запускать эмуляторы для любого или всех поддерживаемых продуктов.

Для любых продуктов, которые вы не эмулируете, ваши приложения и код будут взаимодействовать с активным ресурсом (экземпляром базы данных, сегментом хранилища, функцией и т. д.).

Демо

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

Идентификаторы проектов для демонстрационных проектов имеют префикс demo- .

При работе с демонстрационными проектами Firebase ваши приложения и код взаимодействуют только с эмуляторами. Если ваше приложение попытается взаимодействовать с ресурсом, для которого не запущен эмулятор, этот код завершится ошибкой.

Мы рекомендуем вам использовать демонстрационные проекты везде, где это возможно. Преимущества включают в себя:

  • Простая настройка, так как вы можете запускать эмуляторы, даже не создавая проект Firebase.
  • Повышенная безопасность, поскольку, если ваш код случайно вызывает неэмулируемые (производственные) ресурсы, нет никаких шансов на изменение данных, использование и выставление счетов.
  • Улучшенная автономная поддержка, поскольку нет необходимости в доступе в Интернет для загрузки конфигурации SDK.

Инструментируйте свое приложение для общения с эмулятором

Android, iOS и веб-SDK

Настройте конфигурацию в приложении или тестовые классы для взаимодействия с эмулятором аутентификации следующим образом.

Kotlin+KTX
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Быстрый
Auth.auth().useEmulator(withHost:"127.0.0.1", port:9099)

Web modular API

import { getAuth, connectAuthEmulator } from "firebase/auth";

const auth = getAuth();
connectAuthEmulator(auth, "http://127.0.0.1:9099");

Web namespaced API

const auth = firebase.auth();
auth.useEmulator("http://127.0.0.1:9099");

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

SDK администратора

Пакеты Firebase Admin SDK автоматически подключаются к эмулятору аутентификации, когда установлена ​​переменная среды FIREBASE_AUTH_EMULATOR_HOST .

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

Обратите внимание, что эмулятор облачных функций автоматически распознает эмулятор проверки подлинности, поэтому вы можете пропустить этот шаг при тестировании интеграции между облачными функциями и эмуляторами проверки подлинности. Переменная среды будет автоматически установлена ​​для Admin SDK в Cloud Functions.

С установленной переменной среды Firebase Admin SDK будет принимать неподписанные токены идентификаторов и файлы cookie сеанса, созданные эмулятором аутентификации (через методы verifyIdToken и createSessionCookie соответственно), чтобы облегчить локальную разработку и тестирование. Убедитесь, что переменная среды не установлена ​​в рабочей среде.

Если вы хотите, чтобы ваш код Admin SDK подключался к общему эмулятору, работающему в другой среде, вам нужно будет указать тот же идентификатор проекта, который вы установили с помощью интерфейса командной строки Firebase . Вы можете передать идентификатор проекта напрямую в initializeApp или установить переменную среды GCLOUD_PROJECT .

Пакет SDK для администрирования Node.js
admin.initializeApp({ projectId: "your-project-id" });
Переменная среды
export GCLOUD_PROJECT="your-project-id"

Идентификационные токены

Из соображений безопасности эмулятор аутентификации выдает неподписанные токены идентификатора, которые принимаются только другими эмуляторами Firebase или Firebase Admin SDK при настройке . Эти токены будут отклонены рабочими службами Firebase или Firebase Admin SDK, работающими в рабочем режиме (например, поведение по умолчанию без описанных выше шагов настройки).

Запустите эмулятор

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

Чтобы запустить эмулятор аутентификации, его интерфейс REST и пользовательский интерфейс Emulator Suite, выполните:

firebase emulators:start

Для анонимной аутентификации ваше приложение может использовать логику входа для вашей платформы ( iOS , Android , Интернет ).

Для проверки подлинности по электронной почте/паролю вы можете начать создание прототипа, добавив учетные записи пользователей в эмулятор проверки подлинности из своего приложения с помощью методов SDK проверки подлинности или с помощью пользовательского интерфейса Emulator Suite.

  1. В пользовательском интерфейсе Emulator Suite щелкните вкладку Аутентификация .
  2. Нажмите кнопку Добавить пользователя .
  3. Следуйте указаниям мастера создания учетной записи пользователя, заполнив поля аутентификации электронной почты.

Создав тестового пользователя, ваше приложение может входить и выходить из него с помощью логики SDK для вашей платформы ( iOS , Android , Интернет ).

Для проверки проверки электронной почты/входа в систему с потоками ссылок электронной почты эмулятор печатает URL-адрес терминала, на котором были выполнены firebase emulators:start .

i  To verify the email address customer@ex.com, follow this link:
http://localhost:9099/emulator/action?mode=verifyEmail&lang=en&oobCode=XYZ123&apiKey=fake-api-key

Вставьте ссылку в браузер, чтобы имитировать событие проверки, и проверьте, прошла ли проверка успешно.

{
  "authEmulator": {
    "success": "The email has been successfully verified.",
    "email": "customer@example.com"
  }
}

Для проверки сброса пароля эмулятор выводит аналогичный URL-адрес, включая параметр newPassword (который при необходимости можно изменить), на терминал.

http://localhost:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

Неинтерактивное тестирование

Вместо использования пользовательского интерфейса Emulator Suite или клиентского кода для управления учетными записями пользователей электронной почты и паролей вы можете написать сценарии тестовой настройки, которые вызывают REST API для создания и удаления учетных записей пользователей и получения внеполосных кодов проверки электронной почты для заполнения проверки электронной почты эмулятора. URL. Это разделяет платформу и тестовый код и позволяет проводить тестирование не в интерактивном режиме.

Для неинтерактивных потоков проверки электронной почты и паролей типичная последовательность действий следующая.

  1. Создайте пользователей с конечной точкой REST signUp Authentication.
  2. Войдите в систему пользователей, используя адреса электронной почты и пароли для выполнения тестов.
  3. Если это применимо к вашим тестам, извлеките доступные внеполосные коды подтверждения электронной почты из конечного пункта REST для конкретного эмулятора .
  4. Сбросьте пользовательские записи с конечной точкой REST для эмулятора для очистки данных.

Эмуляция аутентификации по телефону/SMS

Для аутентификации по телефону эмулятор аутентификации не поддерживает:

  • потоки reCAPTCHA и APN. После настройки для взаимодействия с эмулятором клиентские SDK отключают эти методы проверки способом, аналогичным описанному для интеграционного тестирования ( iOS , Android , веб ).
  • Протестируйте телефонные номера с кодами, предварительно настроенными в консоли Firebase.

В остальном, с точки зрения клиентского кода, поток аутентификации по телефону/SMS идентичен описанному для рабочей среды ( iOS , Android , веб ).

Использование пользовательского интерфейса Emulator Suite:

  1. В пользовательском интерфейсе Emulator Suite щелкните вкладку Аутентификация .
  2. Нажмите кнопку Добавить пользователя .
  3. Следуйте указаниям мастера создания учетной записи пользователя, заполнив поля аутентификации телефона.

Однако для потоков аутентификации по телефону эмулятор НЕ будет инициировать доставку каких-либо текстовых сообщений, поскольку связь с оператором связи выходит за рамки и не подходит для локального тестирования! Вместо этого эмулятор распечатывает код, который был бы отправлен по SMS на тот же терминал, на котором вы запускали firebase emulators:start ; введите этот код в приложение, чтобы имитировать пользователей, проверяющих свои текстовые сообщения.

Неинтерактивное тестирование

Для неинтерактивного тестирования проверки подлинности телефона используйте REST API эмулятора проверки подлинности для получения доступных кодов SMS. Обратите внимание, что каждый раз, когда вы инициируете поток, код меняется.

Типичная последовательность следующая.

  1. Позвоните на платформу signInWithPhoneNumber , чтобы начать процесс проверки.
  2. Получите код подтверждения, используя конечную точку REST для эмулятора .
  3. Как обычно, вызовите confirmationResult.confirm(code) с проверочным кодом.

Мультифакторные СМС

Эмулятор проверки подлинности поддерживает прототипирование и тестирование потоков многофакторной проверки подлинности SMS (MFA), доступных в рабочей среде для iOS , Android и Интернета .

Когда вы добавляете фиктивного пользователя в эмулятор, вы можете включить MFA и настроить один или несколько телефонных номеров, на которые будут отправляться SMS-сообщения второго фактора. Сообщения выводятся на тот же терминал, на котором вы запускали firebase emulators:start , и доступны из интерфейса REST.

Эмуляция аутентификации стороннего поставщика удостоверений (IDP)

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

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

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

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

Тестирование потоков IDP на основе Firebase SDK

Если ваше приложение использует какой-либо сквозной поток Firebase SDK, например OAuthProvider для входа в Microsoft, GitHub или Yahoo, для интерактивного тестирования, эмулятор аутентификации предоставляет локальную версию соответствующей страницы входа, чтобы помочь вам протестировать аутентификация из веб-приложений, вызывающих метод signinWithPopup или signInWithRedirect . Эта локальная страница входа также отображается в мобильных приложениях, отображаемых библиотекой веб-просмотра вашей платформы.

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

Тестирование потоков IDP с получением учетных данных вручную

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

Обратите внимание, что эмулятор поддерживает проверку подлинности signInWithCredential только для учетных данных, полученных от Google Sign-In, Apple и других поставщиков, которые используют токены идентификаторов, реализованные в виде веб-токенов JSON (JWT). Маркеры доступа (например, предоставляемые Facebook или Twitter, которые не являются JWT) не поддерживаются. В следующем разделе обсуждается альтернатива в этих случаях.

Неинтерактивное тестирование

Одним из подходов к неинтерактивному тестированию является автоматизация кликов пользователей на странице входа, обслуживаемой эмулятором. Для веб-приложений используйте интерфейс управления, например WebDriver. Для мобильных устройств используйте инструменты тестирования пользовательского интерфейса на вашей платформе, такие как Espresso или Xcode.

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

  1. Перемонтируйте или закомментируйте часть вашего кода, которая извлекает idTokens из IDP; это устраняет необходимость вводить настоящие имена пользователей и пароли во время ваших тестов, а также освобождает ваши тесты от квот API и ограничений скорости в IDP.
  2. Во-вторых, используйте буквальную строку JSON вместо токена для signInWithCredential . Используя веб-SDK в качестве примера, вы можете изменить код на:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

При использовании с эмулятором этот код успешно аутентифицирует пользователя с электронной почтой foo@example.com в Google. Думайте о подполе как о первичном ключе, который можно изменить на любую строку, имитируя подпись разных пользователей. Вы можете заменить firebase.auth.GoogleAuthProvider , например, new firebase.auth.OAuthProvider('yahoo.com') или любым другим идентификатором провайдера, который вы хотите имитировать.

Эмулируемая пользовательская аутентификация с помощью токена

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

Чем эмулятор аутентификации отличается от продакшена

Эмулятор Firebase Authentication имитирует многие функции производственного продукта. Однако, поскольку любая система аутентификации в значительной степени зависит от безопасности на нескольких уровнях (устройство, сторонние поставщики, Firebase и т. д.), эмулятору сложно правильно воссоздать все потоки.

Облачный IAM

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

Поскольку на мобильных платформах вход по ссылке электронной почты зависит от динамических ссылок Firebase, все такие ссылки вместо этого будут открываться на (мобильной) веб-платформе.

Сторонний вход

Для сторонних потоков входа Firebase Authentication использует безопасные учетные данные от сторонних поставщиков, таких как Twitter и Github.

Реальные учетные данные от поставщиков OpenID Connect, таких как Google и Apple, принимаются эмулятором аутентификации. Учетные данные от поставщиков, не входящих в OpenID Connect, не поддерживаются.

Вход по электронной почте / SMS

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

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

Аутентификация пользовательского токена

Эмулятор проверки подлинности не проверяет подпись или срок действия пользовательских токенов. Это позволяет вам использовать созданные вручную токены и многократно повторно использовать токены в сценариях прототипирования и тестирования.

Ограничение скорости / защита от злоупотреблений

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

Блокирующие функции

В производственной среде пользователи записываются в хранилище один раз после запуска событий beforeCreate и beforeSignIn . Однако из-за технических ограничений эмулятор проверки подлинности выполняет запись в хранилище дважды: один раз после создания пользователя, а другой — после входа в систему. Это означает, что для новых пользователей вы можете успешно вызвать getAuth().getUser() в beforeSignIn в эмуляторе аутентификации, но вы столкнетесь с ошибкой при этом в рабочей среде.

Что дальше?