Перед использованием эмулятора Authentication в вашем приложении убедитесь, что вы понимаете общий рабочий процесс Firebase Local Emulator Suite , а также что вы установили и настроили Local Emulator Suite и ознакомились с его командами CLI .
В этой статье предполагается, что вы уже знакомы с разработкой решений Firebase Authentication для производственной среды. При необходимости ознакомьтесь с документацией по вашей комбинации платформы и метода аутентификации .
Что я могу сделать с помощью эмулятора Authentication ?
Эмулятор Authentication обеспечивает высококачественную локальную эмуляцию сервисов Firebase Authentication , предоставляя большую часть функциональности, доступной в рабочей версии Firebase Authentication . В сочетании с платформами Apple, Android и Firebase SDK для веб-приложений, эмулятор позволяет:
- Создание, обновление и управление эмулированными учетными записями пользователей для тестирования электронной почты/пароля, номера телефона/SMS, многофакторной аутентификации SMS и аутентификации стороннего поставщика удостоверений (например, Google)
- Просмотр и редактирование эмулированных пользователей
- Прототипы систем аутентификации на основе пользовательских токенов
- Проверьте сообщения, связанные с аутентификацией, на вкладке «Журналы пользовательского интерфейса эмулятора».
Выберите проект Firebase
Firebase Local Emulator Suite эмулирует продукты для одного проекта Firebase.
Чтобы выбрать проект, перед запуском эмуляторов выполните в командной строке firebase use
в вашем рабочем каталоге. Или передайте флаг --project
каждой команде эмулятора.
Local Emulator Suite поддерживает эмуляцию реальных проектов Firebase и демонстрационных проектов.
Тип проекта | Функции | Использование с эмуляторами |
---|---|---|
Настоящий | Настоящий проект Firebase — это проект, который вы создали и настроили (скорее всего, через консоль Firebase ). Реальные проекты имеют активные ресурсы, такие как экземпляры базы данных, сегменты хранения, функции или любые другие ресурсы, которые вы настраиваете для этого проекта Firebase. | Работая с реальными проектами Firebase, вы можете запускать эмуляторы для любого или всех поддерживаемых продуктов. Для любых продуктов, которые вы не эмулируете, ваши приложения и код будут взаимодействовать с реальным ресурсом (экземпляром базы данных, контейнером хранилища, функцией и т. д.). |
Демо | Демонстрационный проект Firebase не имеет реальной конфигурации Firebase и активных ресурсов. Доступ к таким проектам обычно осуществляется через практическое руководство или другие обучающие материалы. Идентификаторы демонстрационных проектов имеют префикс | При работе с демонстрационными проектами 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 и сеансовые cookie-файлы, выдаваемые эмулятором Authentication (через методы verifyIdToken
и createSessionCookie
соответственно), для упрощения локальной разработки и тестирования. Пожалуйста, не устанавливайте переменную окружения в рабочей среде.
Если вы хотите, чтобы ваш код Admin SDK подключался к общему эмулятору, работающему в другой среде, вам потребуется указать тот же идентификатор проекта, который вы задали в Firebase CLI . Вы можете передать идентификатор проекта непосредственно в initializeApp
или задать переменную среды GCLOUD_PROJECT
.
SDK администратора Node.js
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 .
- В Emulator Suite UI выберите вкладку «Аутентификация» .
- Нажмите кнопку Добавить пользователя .
- Следуйте указаниям мастера создания учетной записи пользователя, заполняя поля аутентификации электронной почты.
После создания тестового пользователя ваше приложение может входить и выходить из системы с помощью логики 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-адреса подтверждения электронной почты эмулятора. Это позволяет разделить код платформы и тестового кода и проводить тестирование в неинтерактивном режиме.
Для неинтерактивных потоков тестирования электронной почты и паролей типичная последовательность выглядит следующим образом.
- Создайте пользователей с помощью конечной точки REST Authentication signUp.
- Авторизуйте пользователей, используя адреса электронной почты и пароли, для проведения тестов.
- Если это применимо к вашим тестам, извлеките доступные внеполосные коды проверки электронной почты из конечной точки REST эмулятора .
- Очистите записи пользователей с помощью конечной точки REST, специфичной для эмулятора , для очистки данных.
Эмулированная аутентификация по телефону/SMS
Для аутентификации по телефону эмулятор Auth не поддерживает:
- Потоки reCAPTCHA и APN. После настройки взаимодействия с эмулятором клиентские SDK отключают эти методы проверки аналогично тому, как это описано для интеграционного тестирования ( iOS , Android , веб ).
- Тестовые номера телефонов с кодами, предварительно настроенными в консоли Firebase .
В остальном, с точки зрения клиентского кода, поток аутентификации по телефону/SMS идентичен описанному для производства ( iOS , Android , веб ).
Использование Emulator Suite UI :
- В Emulator Suite UI выберите вкладку «Аутентификация» .
- Нажмите кнопку Добавить пользователя .
- Следуйте указаниям мастера создания учетной записи пользователя, заполняя поля аутентификации телефона.
Однако для аутентификации по телефону эмулятор НЕ будет инициировать отправку каких-либо SMS-сообщений, поскольку обращение к оператору связи выходит за рамки возможностей и не подходит для локального тестирования! Вместо этого эмулятор выводит код, который был бы отправлен по SMS, на тот же терминал, на котором вы запустили firebase emulators:start
; введите этот код в приложение, чтобы имитировать проверку сообщений пользователями.
Неинтерактивное тестирование
Для неинтерактивного тестирования аутентификации по телефону используйте REST API эмулятора Authentication для получения доступных SMS-кодов. Обратите внимание, что код будет разным при каждом запуске процесса.
Типичная последовательность выглядит следующим образом.
- Позвоните на платформу
signInWithPhoneNumber
, чтобы начать процесс проверки. - Получите код проверки, используя конечную точку REST эмулятора .
- Вызовите
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 и других поставщиков, использующих идентификационные токены, реализованные в виде JSON Web Tokens (JWT). Токены доступа (например, предоставляемые Facebook или Twitter, которые не являются JWT) не поддерживаются. В следующем разделе рассматривается альтернативный вариант для таких случаев.
Неинтерактивное тестирование
Один из подходов к неинтерактивному тестированию — автоматизация действий пользователя на странице входа, обслуживаемой эмулятором. Для веб-приложений используйте интерфейс управления, например WebDriver. Для мобильных устройств используйте инструменты тестирования пользовательского интерфейса вашей платформы, например, Espresso или Xcode.
В качестве альтернативы вы можете обновить свой код, чтобы использовать signInWithCredential
(например, в ветке кода) и использовать поток аутентификации токенов с поддельными токенами ID для учетных записей вместо реальных учетных данных.
- Перекомпонуйте или закомментируйте часть кода, которая извлекает idTokens из IDP; это устраняет необходимость ввода реальных имен пользователей и паролей во время тестов и освобождает ваши тесты от квот API и ограничений скорости в IDP.
- Во-вторых, используйте 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, все такие ссылки будут открываться на (мобильной) веб-платформе.
Вход через третью сторону
Для потоков входа третьих лиц Authentication Firebase использует защищенные учетные данные от сторонних поставщиков, таких как Twitter и Github.
Эмулятор Authentication принимает настоящие учётные данные от поставщиков OpenID Connect, таких как Google и Apple. Учётные данные от поставщиков, не поддерживающих OpenID Connect, не поддерживаются.
Вход по электронной почте/SMS
В рабочих приложениях вход через электронную почту и SMS представляет собой асинхронную операцию, в ходе которой пользователь проверяет полученное сообщение и вводит код входа в интерфейс входа. Эмулятор Authentication не отправляет электронные письма или SMS, но, как описано выше , генерирует коды входа и выводит их на терминал для использования при тестировании.
Эмулятор не поддерживает возможность определения тестовых телефонных номеров с фиксированными кодами входа, как это можно сделать с помощью консоли Firebase .
Аутентификация с помощью пользовательского токена
Эмулятор Authentication не проверяет подпись или срок действия пользовательских токенов. Это позволяет использовать токены, созданные вручную, и повторно использовать их неограниченное количество раз в сценариях прототипирования и тестирования.
Ограничение скорости / борьба со злоупотреблениями
Эмулятор Authentication не воспроизводит функции ограничения скорости производства или борьбы со злоупотреблениями.
Блокирующие функции
В рабочей среде данные пользователей записываются в хранилище один раз после срабатывания событий beforeCreate
и beforeSignIn
. Однако из-за технических ограничений эмулятор Authentication записывает данные в хранилище дважды: один раз после создания пользователя и один раз после входа в систему. Это означает, что для новых пользователей можно успешно вызвать getAuth().getUser()
в beforeSignIn
в эмуляторе Authentication , но в рабочей среде при этом возникнет ошибка.
Что дальше?
Подборку видеороликов и подробные практические примеры смотрите в обучающем плейлисте по работе с эмуляторами Firebase .
Поскольку запущенные функции представляют собой типичную интеграцию с Authentication , узнайте больше о функциях облака для эмулятора Firebase в разделе Локальный запуск функций .