Настройте соответствующий доступ для расширения

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

Что такое учетная запись службы?

Учётная запись сервиса — это особый тип учётной записи пользователя Google. Она представляет собой пользователя, не являющегося человеком, который может выполнять авторизованные вызовы API к сервисам Google.

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

Учетные записи служб, созданные для расширений, имеют следующий формат:

ext- extension-instance-id @ project-id .iam.gserviceaccount.com

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

Определите, какие роли требуются вашему расширению

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

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

  1. Определите, взаимодействует ли ваше расширение с продуктом:

    • Если ваше расширение взаимодействует с продуктом , вам необходимо предоставить расширению доступ к этому продукту.

      Например, если ваше расширение записывает данные в экземпляр Realtime Database , то вашему расширению необходима роль Realtime Database (в частности, firebasedatabase.admin ).

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

      Например, если ваше расширение срабатывает при записи в экземпляр Realtime Database (но ничего не записывает в базу данных), то вашему расширению не нужна роль Realtime Database .

  2. Определив, с какими продуктами взаимодействует ваше расширение, вам необходимо решить, какая роль требуется для этого взаимодействия. Некоторые продукты предлагают разные роли в зависимости от выполняемого действия или набора действий.

    Например, ваше расширение взаимодействует с контейнером Cloud Storage . Роль storage.objectCreator позволяет расширению создавать объекты в контейнере Cloud Storage , но не позволяет просматривать, удалять или перезаписывать объекты. Чтобы разрешить расширению выполнять эти дополнительные действия, необходимо назначить роль storage.objectAdmin .

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

Как назначить роли расширению

Перечислите роли IAM, необходимые для работы вашего расширения, в разделе roles файла extension.yaml .

Вот пример расширения, которое прослушивает указанный путь к Firebase Realtime Database . При срабатывании расширение обновляет адрес электронной почты пользователя (взаимодействие с Firebase Authentication ) и отправляет уведомление (взаимодействие с Firebase Cloud Messaging ). Обратите внимание на следующее:

  • Несмотря на то, что расширение запускается из события Realtime Database , роль firebasedatabase.admin не указана (прослушивание не считается взаимодействием ).
  • Поскольку расширение взаимодействует с Authentication и Cloud Messaging , расширению требуются роли для доступа к этим продуктам ( firebaseauth.admin и firebasenotifications.admin соответственно).
# extension.yaml
...

# Roles assigned to the extension's service account by Firebase during installation
roles:
  - role: firebaseauth.admin
    reason: Required to update the email address of the user account

  - role: firebasenotifications.admin
    reason: Required to send a notification that the email address has been updated

...

В файле extension.yaml используйте следующие поля для назначения роли учетной записи службы расширения:

Поле Тип Описание
role
(необходимый)
нить Имя роли IAM , необходимой для работы расширения
reason
(необходимый)
нить

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

Обязательно предоставьте достаточно подробностей, чтобы пользователь мог понять, как расширение использует роль.

resource
(необязательный)
нить

В IAM-политику какого ресурса следует добавить эту роль? Если не указано иное, по умолчанию используется projects/${project_id} .

Поддерживаемые значения: projects/* и projects/*/buckets/* .

Сократить объем ролей

Расширения должны следовать принципу наименьших привилегий и запрашивать доступ только к тем ресурсам, которые им необходимы. Вы можете ограничить область доступа расширения с помощью поля role.resource . Например, если вашему расширению необходимо записывать объекты в контейнер Cloud Storage, вы можете использовать следующую роль:

roles:
  - role: storage.objectCreator
    reason: Needed in order to write
    resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}

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

Это поле поддерживает проекты ( projects/{project_id} ) и контейнеры хранения ( projects/{project_id}/buckets/{bucket_id} ).

Поддерживаемые роли для расширений

В следующей таблице перечислены поддерживаемые роли IAM для взаимодействия с продуктами Firebase. Большинство ролей в этой таблице относятся к уровню продукта Firebase , но некоторые из них управляются непосредственно Google Cloud (в частности, Cloud Firestore и Cloud Storage ).

Продукты Firebase

Если ваше расширение взаимодействует с... Назначьте одну из этих ролей...
Cloud Firestore datastore.importExportAdmin
datastore.indexAdmin
datastore.owner
хранилище данных.пользователь
datastore.viewer
Cloud Storage for Firebase storage.admin
storage.objectAdmin
storage.objectCreator
storage.objectViewer
Firebase App Distribution firebaseappdistro.admin
firebaseappdistro.viewer
Firebase Authentication firebaseauth.admin
firebaseauth.viewer
Firebase A/B Testing firebaseabt.admin
firebaseabt.viewer
Firebase Cloud Messaging firebasenotifications.admin
firebasenotifications.viewer
Firebase Crashlytics firebasecrashlytics.admin
firebasecrashlytics.viewer
Firebase Hosting firebasehosting.admin
firebasehosting.viewer
Firebase In-App Messaging firebaseinappmessaging.admin
firebaseinappmessaging.viewer
Firebase ML firebaseml.admin
firebaseml.viewer
Firebase Performance Monitoring firebaseperformance.viewer
firebaseperformance.reader
firebaseperformance.writer
Firebase Realtime Database firebasedatabase.admin
firebasedatabase.viewer
Правила безопасности firebaserules.viewer
firebaserules.developer
firebaserules.deployer
Google Analytics firebaseanalytics.admin
firebaseanalytics.viewer

Продукты Google Cloud

Подробнее об этих ролях читайте в документации Google Cloud .

Если ваше расширение взаимодействует с... Назначьте одну из этих ролей...
Действия действия.Админ
действия.Просмотрщик
Апигей apigee.analyticsAgent
apigee.analyticsEditor
apigee.analyticsViewer
apigee.apiCreator
apigee.deployer
apigee.developerAdmin
apigee.readOnlyAdmin
apigee.synchronizerManager
App Engine appengine.appAdmin
appengine.appViewer
appengine.codeViewer
appengine.deployer
appengine.serviceAdmin
AutoML automl.editor
automl.predictor
automl.viewer
BigQuery bigquery.connectionAdmin
bigquery.connectionUser
bigquery.dataEditor
bigquery.dataOwner
bigquery.dataViewer
bigquery.jobUser
bigquery.metadataViewer
bigquery.readSessionUser
bigquery.user
Облако Bigtable bigtable.reader
bigtable.user
bigtable.viewer
Биллинг billing.viewer
Hangouts Chats владелец чата
чат.ридер
Облачный актив cloudasset.owner
cloudasset.viewer
Облачное слияние данных datafusion.admin
datafusion.viewer
Облачный отладчик clouddebugger.agent
clouddebugger.user
Облачные функции cloudfunctions.invoker
cloudfunctions.viewer
Облачный IAP iap.admin
iap.httpsResourceAccessor
iap.settingsAdmin
iap.tunnelResourceAccessor
Облачный Интернет вещей cloudiot.deviceController
cloudiot.editor
cloudiot.provisioner
cloudiot.viewer
Stackdriver Profiler cloudprofiler.agent
cloudprofiler.user
Cloud Scheduler cloudscheduler.admin
cloudscheduler.jobRunner
cloudscheduler.viewer
Сканер безопасности облака cloudsecurityscanner.editor
cloudsecurityscanner.runner
cloudsecurityscanner.viewer
Облачный SQL cloudsql.client
cloudsql.editor
cloudsql.viewer
Облачный след cloudtrace.admin
cloudtrace.agent
cloudtrace.user
Поток данных dataflow.developer
dataflow.viewer
dataflow.worker
Dialogflow dialogflow.admin
dialogflow.клиент
dialogflow.reader
Предотвращение потерь данных в облаке dlp.reader
dlp.user
Сообщение об ошибках errorreporting.user
errorreporting.viewer
errorreporting.writer
Eventarc eventarc.publisher
eventarc.eventReceiver
Облачное хранилище файлов файл.редактор
файл.viewer
Ведение журнала logging.configWriter
logging.logWriter
logging.privateLogViewer
logging.viewer
Двигатель машинного обучения мл.разработчик
ml.jobOwner
ml.modelOwner
ml.modelUser
ml.operationOwner
ml.viewer
Мониторинг мониторинг.редактор
мониторинг.metricWriter
monitoring.viewer
Записные книжки с искусственным интеллектом блокноты.админ
блокноты.просмотрщик
Pub/Sub pubsub.editor
pubsub.publisher
pubsub.subscriber
pubsub.viewer
Память Redis redis.editor
redis.viewer
Cloud Run run.invoker
Источник источник.читатель
источник.писатель
Облачный гаечный ключ spanner.databaseAdmin
spanner.databaseReader
spanner.databaseUser
гаечный ключ.viewer
Использование услуг serviceusage.apiKeysMetadataViewer
Служба передачи облачного хранилища storagetransfer.user
storagetransfer.viewer
Облачный транскодер transcoder.admin
transcoder.viewer
Вершинный ИИ aiplatform.user
Другой identitytoolkit.admin
identitytoolkit.viewer