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

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

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

Что я могу сделать с помощью эмулятора Authentication ?

Эмулятор 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 и живых ресурсов. К таким проектам обычно обращаются через codelabs или другие руководства.

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

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

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

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

Настройте свое приложение для взаимодействия с эмулятором

Android, iOS и веб-SDK

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

Kotlin
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

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

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

Web

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

Никакой дополнительной настройки не требуется для прототипирования и тестирования взаимодействия между Authentication и Cloud Functions или Firebase Security Rules для Cloud Firestore или Realtime Database . Когда эмулятор Authentication настроен и другие эмуляторы запущены, они автоматически работают вместе.

Admin SDK s

Firebase Admin SDK автоматически подключается к эмулятору Authentication , если задана переменная среды FIREBASE_AUTH_EMULATOR_HOST .

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

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

Если задана переменная окружения, Firebase Admin SDK будут принимать неподписанные токены ID и сеансовые куки, выданные эмулятором Authentication (через методы verifyIdToken и createSessionCookie соответственно), для упрощения локальной разработки и тестирования. Пожалуйста, убедитесь, что не задали переменную окружения в производстве.

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

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

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

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

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

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

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

firebase emulators:start

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

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

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

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

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

i  To verify the email address customer@ex.com, follow this link:
http://127.0.0.1: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://127.0.0.1:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

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

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

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

  1. Создайте пользователей с помощью конечной точки REST Authentication signUp» .
  2. Авторизуйте пользователей, используя адреса электронной почты и пароли, для выполнения тестов.
  3. Если это применимо к вашим тестам, извлеките доступные внеполосные коды проверки электронной почты из конечной точки REST эмулятора .
  4. Очистите записи пользователей с помощью конечной точки REST эмулятора для очистки данных.

Эмулированная аутентификация по телефону/СМС

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

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

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

Использование Emulator Suite UI :

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

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

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

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

Типичная последовательность выглядит следующим образом.

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

Многофакторная СМС

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

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

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

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

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

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

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

Тестирование потоков IDP, управляемых Firebase SDK

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

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

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

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

Обратите внимание, что эмулятор поддерживает только аутентификацию signInWithCredential для учетных данных, полученных от Google Sign-In, Apple и других поставщиков, которые используют токены ID, реализованные как JSON Web Tokens (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') или любой другой идентификатор провайдера, который вы хотите имитировать.

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

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

Чем эмулятор Authentication отличается от производства

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

Облачный IAM

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

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

Вход через третью сторону

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

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

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

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

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

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

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

Ограничение скорости/борьба со злоупотреблениями

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

Блокировка функций

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

Что дальше?