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

Чтобы расширение могло выполнять указанные действия, 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
хранилище данных.владелец
хранилище данных.пользователь
хранилище данных.просмотрщик
Cloud Storage for Firebase хранилище.админ
storage.objectAdmin
storage.objectCreator
storage.objectViewer
Firebase App Distribution firebaseappdistro.admin
firebaseappdistro.viewer
Firebase Authentication firebaseauth.админ
firebaseauth.просмотрщик
Firebase A/B Testing firebaseabt.админ
firebaseabt.viewer
Firebase Cloud Messaging firebasenotifications.админ
firebasenotifications.viewer
Firebase Crashlytics firebasecrashlytics.админ
firebasecrashlytics.просмотрщик
Firebase Hosting firebasehosting.админ
firebasehosting.просмотрщик
Firebase In-App Messaging firebaseinappmessaging.админ
firebaseinappmessaging.viewer
Firebase ML firebaseml.админ
firebaseml.просмотрщик
Firebase Performance Monitoring firebaseperformance.viewer
firebaseperformance.reader
firebaseperformance.писатель
Firebase Realtime Database firebasedatabase.admin
firebasedatabase.viewer
Правила безопасности firebaserules.просмотрщик
firebaserules.разработчик
firebaserules.deployer
Google Analytics firebaseanalytics.админ
firebaseanalytics.viewer

Продукты Google Cloud

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

Если ваше расширение взаимодействует с... Назначьте одну из этих ролей...
Действия действия.Админ
действия.Зритель
Апигей apigee.analyticsAgent
apigee.analyticsРедактор
apigee.analyticsViewer
apigee.apiCreator
apigee.развертыватель
apigee.developerАдминистратор
apigee.readOnlyАдминистратор
apigee.synchronizerManager
App Engine appengine.appAdmin
appengine.appViewer
appengine.codeViewer
appengine.deployer
appengine.serviceAdmin
АвтоML automl.редактор
автомл.предиктор
automl.viewer
BigQuery bigquery.connectionАдминистратор
bigquery.connectionUser
bigquery.dataEditor
bigquery.dataВладелец
bigquery.dataViewer
bigquery.jobUser
bigquery.metadataViewer
bigquery.readSessionUser
bigquery.пользователь
Облако Bigtable bigtable.читатель
bigtable.пользователь
bigtable.просмотрщик
Биллинг биллинг.просмотрщик
Чаты Hangouts чат.владелец
чат.читатель
Облачный актив cloudasset.владелец
cloudasset.viewer
Объединение облачных данных datafusion.админ
datafusion.просмотрщик
Облачный отладчик clouddebugger.агент
clouddebugger.пользователь
Облачные функции cloudfunctions.invoker
cloudfunctions.viewer
Облачный IAP iap.админ
iap.httpsResourceAccessor
iap.settingsАдминистратор
iap.tunnelResourceAccessor
Облачный Интернет вещей cloudiot.deviceКонтроллер
cloudiot.редактор
cloudiot.провайдер
cloudiot.просмотрщик
Профайлер Stackdriver cloudprofiler.агент
cloudprofiler.пользователь
Cloud Scheduler облакаscheduler.админ
облакаscheduler.jobRunner
cloudscheduler.просмотрщик
Сканер безопасности облака cloudsecurityscanner.редактор
cloudsecurityscanner.runner
cloudsecurityscanner.viewer
Облачный SQL cloudsql.клиент
cloudsql.редактор
cloudsql.viewer
Облачный след cloudtrace.админ
cloudtrace.агент
cloudtrace.пользователь
Поток данных поток данных.разработчик
поток данных.просмотрщик
поток данных.работник
Dialogflow dialogflow.админ
dialogflow.клиент
dialogflow.читатель
Предотвращение потери данных в облаке dlp.reader
dlp.пользователь
Сообщение об ошибках errorreporting.пользователь
errorreporting.viewer
errorreporting.писатель
Eventarc eventarc.издатель
eventarc.приемник событий
Облачное хранилище файлов файл.редактор
файл.просмотрщик
Ведение журнала logging.configWriter
logging.logWriter
logging.privateLogViewer
logging.viewer
Машинное обучение мл.разработчик
ml.jobOwner
ml.modelВладелец
ml.modelUser
ml.operationВладелец
мл.просмотрщик
Мониторинг мониторинг.редактор
мониторинг.metricWriter
мониторинг.просмотрщик
Блокноты ИИ блокноты.админ
блокноты.просмотрщик
Pub/Sub pubsub.редактор
pubsub.издатель
pubsub.подписчик
pubsub.viewer
Память-хранилище Redis redis.редактор
redis.просмотрщик
Облачный забег запустить.invoker
Источник источник.читатель
источник.писатель
Облачный гаечный ключ spanner.databaseAdmin
spanner.databaseReader
spanner.databaseUser
гаечный ключ.просмотрщик
Использование услуг serviceusage.apiKeysMetadataViewer
Служба передачи облачного хранилища storagetransfer.пользователь
storagetransfer.viewer
Облачный транскодер транскодер.админ
транскодер.просмотрщик
Вершина ИИ aiplatform.пользователь
Другой identitytoolkit.админ
identitytoolkit.viewer