Google стремится к продвижению расового равенства для чернокожего населения. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Протестируйте Облако Firestore Правила безопасности

Как вы строите ваше приложение, вы можете заблокировать доступ к базе данных Cloud Firestore. Однако, прежде чем начать, вы будете нуждаться в более тонких облачных Firestore правил безопасности. С эмулятором Cloud Firestore, вы можете писать тесты, которые проверяют поведение ваших облачных правил безопасности Firestore.

Быстрый старт

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

Понимать правила Облако Firestore безопасности

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

Облако Firestore Правила безопасности включают в себя две части:

  1. match заявление , которое идентифицирует документы в базе данных.
  2. allow выражение , которое контролирует доступ к этим документам.

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

Каждый запрос базы данных из библиотеки мобильных / веб-клиента Облако Firestore оценивается по вашим правилам безопасности, прежде чем читать или писать какие-либо данные. Если правила запрещают доступ к любому из указанных путей документа, весь запрос не удается.

Узнайте больше о облачных правилах Firestore безопасности в Начале работы с Cloud правил безопасности Firestore .

Установите эмулятор

Чтобы установить эмулятор Cloud Firestore, используйте Firebase CLI и запустить следующую команду:

firebase setup:emulators:firestore

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

Запустите эмулятор с помощью следующей команды. Эмулятор будет работать, пока вы не убить процесс:

firebase emulators:start --only firestore

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

firebase emulators:exec --only firestore "./my-test-script.sh"

При запуске эмулятор будет пытаться работать на порт по умолчанию (8080). Вы можете изменить порт эмулятора путем изменения "emulators" раздел вашего firebase.json файла:

{
  // ...
  "emulators": {
    "firestore": {
      "port": "YOUR_PORT"
    }
  }
}

Перед тем, как запустить эмулятор

Перед тем, как начать использовать эмулятор, имейте в виду следующее:

  • Эмулятор сначала загрузить правила , указанные в firestore.rules поле вашего firebase.json файла. Он ожидает, что имя локального файла, содержащего облачную Firestore правила безопасности и применяет эти правила ко всем проектам. Если вы не предоставите локальный путь к файлу или использовать loadFirestoreRules метод , как описано ниже, эмулятор обрабатывает все проекты , как имеющие открытые правила.
  • В то время как многие SDKs работать с эмуляторами, только @firebase/testing Node.js модуль поддерживает насмешливую auth в правилах безопасности, делая модульные тесты гораздо проще. Кроме того, модуль поддерживает несколько эмулятора специфические функции, такие как удаление всех данных, которые перечислены ниже.
  • Эмуляторы также принимает производство Firebase Auth лексемы осуществляется через клиента SDKs и оценивать правила соответственно, что позволяет подключать приложения непосредственно эмуляторов в интеграции и ручных тестов.

Выполнить местные тесты

initializeTestApp({ projectId: string, auth: Object }) => FirebaseApp

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

firebase.initializeTestApp({
  projectId: "my-test-project",
  auth: { uid: "alice", email: "alice@example.com" }
});

initializeAdminApp({ projectId: string }) => FirebaseApp

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

firebase.initializeAdminApp({ projectId: "my-test-project" });
    

apps() => [FirebaseApp] Этот метод возвращает все в настоящее время инициализированы тестирования и администратора приложения. Используйте это, чтобы очистить приложения между или после испытаний.

Promise.all(firebase.apps().map(app => app.delete()))

loadFirestoreRules({ projectId: string, rules: Object }) => Promise

Этот метод отправляет правила локально работающей базы данных. Он принимает объект, который определяет правила в виде строки. Используйте этот метод, чтобы установить правила вашей базы данных.

firebase.loadFirestoreRules({
  projectId: "my-test-project",
  rules: fs.readFileSync("/path/to/firestore.rules", "utf8")
});
    

assertFails(pr: Promise) => Promise

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

firebase.assertFails(app.firestore().collection("private").doc("super-secret-document").get());
    

assertSucceeds(pr: Promise) => Promise

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

firebase.assertSucceeds(app.firestore().collection("public").doc("test-document").get());
    

clearFirestoreData({ projectId: string }) => Promise

Этот метод удаляет все данные, связанные с конкретным проектом в локально запущенном экземпляре Firestore. Используйте этот метод для очистки после испытаний.

firebase.clearFirestoreData({
  projectId: "my-test-project"
});
   

Создание отчетов тестирования

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

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

http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage.html

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

http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage

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

  1. Вам не нужно явно создать проект Cloud Firestore. Эмулятор автоматически создает любой экземпляр, доступ.
  2. Эмулятор Облако Firestore не работает с нормальным потоком Firebase аутентификации. Вместо этого, в Firebase Test SDK, мы обеспечили initializeTestApp() метод в модуле тестирования, который принимает auth поле. Ручка Firebase создана с помощью этого метода будет вести себя так, как будто он успешно прошел проверку подлинности, как любой объект вы предоставляете. Если вы передаете в null , он будет вести себя как неаутентифицированный пользователь ( auth != null правила не получится , к примеру).

вопросы устраняйте известны

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

Поведение испытаний противоречиво

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

В частности, рассмотреть следующие операции асинхронных:

  • Настройка правил безопасности, а также, например, firebase.loadFirestoreRules .
  • Чтение и запись данных, например, db.collection("users").doc("alice").get() .
  • Оперативные утверждения, в том числе firebase.assertSucceeds и firebase.assertFails .

Испытания только пройти первый раз при загрузке эмулятора

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

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

Тестовая конфигурация очень сложная

Вы можете сценарии тестирования, что ваше Облако Firestore правило безопасности фактически не позволяет. Например, тестирование могут ли неаутентифицированные пользователи редактировать данные трудно проверить, так как вы не может редактировать данные в качестве неаутентифицированного пользователя.

Если ваши правила делают тест установки комплекса, попробуйте с помощью клиента администратора разрешенным для обхода правил. Вы можете сделать это с firebase.initializeAdminApp . Чтение и запись от администратора разрешенных клиентов перепуска правил и не вызывают PERMISSION_DENIED ошибок.