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

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

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

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

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

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

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

Пакет локальных эмуляторов Firebase эмулирует продукты для одного проекта 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 для Cloud Firestore или базы данных реального времени не требуется. Когда эмулятор аутентификации настроен и другие эмуляторы запущены, они автоматически работают вместе.

Административные SDK

SDK администратора Firebase автоматически подключаются к эмулятору аутентификации, когда установлена ​​переменная среды 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 CLI . Вы можете передать идентификатор проекта напрямую в initializeApp или установить переменную среды GCLOUD_PROJECT .

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

ID-токены

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

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

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

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

firebase emulators:start

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

Для аутентификации по электронной почте и паролю вы можете начать создание прототипа, добавив учетные записи пользователей в эмулятор аутентификации из вашего приложения с помощью методов Authentication 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://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 или клиентского кода для управления учетными записями пользователей электронной почты и паролей вы можете написать сценарии настройки тестирования, которые вызывают API-интерфейсы REST для создания и удаления учетных записей пользователей и получения внеполосных кодов проверки электронной почты для заполнения проверки электронной почты эмулятора. URL-адрес. Это позволяет разделить платформу и тестовый код и позволяет проводить тестирование в неинтерактивном режиме.

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

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

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

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

  • Потоки 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 имитирует многие функции производственного продукта. Однако, поскольку любая система аутентификации в значительной степени зависит от безопасности на нескольких уровнях (устройство, сторонние поставщики, Firebase и т. д.), эмулятору сложно правильно воссоздать все потоки.

Облачный IAM

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

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

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

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

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

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

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

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

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

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

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

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

Функции блокировки

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

Что дальше?