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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Демо

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

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

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

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

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

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

SDK для Android, iOS и веб-приложений

Настройте параметры приложения или тестовые классы для взаимодействия с эмулятором 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

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

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

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

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

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

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
Переменная окружающей среды
export GCLOUD_PROJECT="your-project-id"

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

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

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

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

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

firebase emulators:start

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

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

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

Для аутентификации по телефону эмулятор 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) как обычно, указав код подтверждения.

Многофакторная аутентификация по SMS

Эмулятор 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, управляемых SDK Firebase.

Если ваше приложение использует какой-либо сквозной поток аутентификации 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-токены для учетных записей вместо реальных учетных данных.

  1. Измените код или закомментируйте ту часть, которая получает idTokens от поставщика идентификационных данных (IDP); это избавит вас от необходимости вводить реальные имена пользователей и пароли во время тестирования, а также освободит ваши тесты от ограничений API и лимитов скорости запросов у IDP.
  2. Во-вторых, вместо токена для signInWithCredential используйте буквальную JSON-строку. В качестве примера, используя веб-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 Web Token, используя вызовы метода signInWithCustomToken на поддерживаемых платформах, как описано в документации Authentication в рабочей среде .

Чем эмулятор Authentication отличается от рабочей среды?

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

Cloud IAM

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

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

Вход через сторонний сервис

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

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

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

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

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

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

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

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

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

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

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

Что дальше?