对于要执行指定操作的扩展程序,Firebase 会通过服务账号向所安装的扩展程序的每个实例授予对项目及其数据的受限访问权限。
什么是服务账号?
服务账号是一种特殊类型的 Google 用户账号。它代表对 Google 服务执行已获授权的 API 调用的非人类用户。
在扩展程序安装期间,Firebase 会在项目中为该扩展程序创建一个服务账号。每个已安装的扩展程序实例都有自己的服务账号。如果卸载了某个扩展程序实例,Firebase 会删除该扩展程序的服务账号。
为扩展程序创建的服务账号采用以下格式:
ext-extension-instance-id@project-id.iam.gserviceaccount.com
Firebase 通过将特定角色(一组权限)分配给扩展程序的服务账号,来限制该扩展程序对项目及其数据的访问权限。构建扩展程序时,您需要确定运行扩展程序所需的角色,然后在 extension.yaml 文件中列出这些角色以及扩展程序需要它们的原因(请参阅本页底部的示例)。
确定扩展程序需要哪些角色
构建扩展程序时,您需要确定运行扩展程序所需的访问权限级别。
在安装过程中,Firebase CLI 会提示用户接受每个角色所授予的访问权限级别。如果您的扩展程序请求的角色超出其实际需要,则用户不太可能会安装该扩展程序。
- 确定扩展程序是否与产品交互: - 如果扩展程序要与产品交互,那么您需要向扩展程序授予对该产品的访问权限。 - 例如,如果扩展程序将数据写入到 Realtime Database 实例,则扩展程序需要一个 Realtime Database 角色(具体来说就是 - firebasedatabase.admin)。
- 如果扩展程序只侦听产品中的触发事件,则该扩展程序不需要与该产品关联的角色。 - 例如,如果扩展程序在 Realtime Database 实例发生写入事件时触发(但不向数据库写入任何内容),则扩展程序不需要 Realtime Database 角色。 
 
- 在确定要与扩展程序进行交互的产品之后,您需要确定每个具体交互需要哪个角色。某些产品提供不同的角色,具体取决于所执行的操作或操作组。 - 例如,假设扩展程序与 Cloud Storage 存储桶进行交互。 - storage.objectCreator角色将允许扩展程序在 Cloud Storage 存储桶中创建对象,但该角色不允许扩展程序查看、删除或覆盖对象。要使扩展程序能够执行这些额外的操作,您需要改为分配- storage.objectAdmin角色。
请参阅本页底部的部分,查看您可以为自己的扩展程序服务账号分配的所有受支持的角色。要了解每个角色的说明及授予的权限,请参阅 Firebase 文档或 Google Cloud 文档。您还可以在 Google Cloud 控制台的 IAM 和管理面板中查找角色。
如何向扩展程序分配角色
在 extension.yaml 文件的 roles 部分列出运行扩展程序所需的 IAM 角色。
以下示例展示了侦听指定 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 政策。如果省略,则默认为  支持的值包括  | 
缩小角色授予的权限范围
扩展程序应遵循最小权限原则,并且仅请求访问所需资源。您可以使用 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})。
扩展程序支持的角色
下表列出了能够与 Firebase 产品进行交互的受支持的 IAM 角色。该表中的大多数角色都是 Firebase 产品级角色,但有些角色由 Google Cloud(具体来讲是 Cloud Firestore 和 Cloud Storage)直接管理。
Firebase 产品
| 如果扩展程序与以下服务进行交互… | 分配其中一种角色… | 
|---|---|
| Cloud Firestore | datastore.importExportAdmin datastore.indexAdmin datastore.owner datastore.user 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 文档。
| 如果扩展程序与以下服务进行交互… | 分配其中一种角色… | 
|---|---|
| 操作 | actions.Admin actions.Viewer | 
| Apigee | 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 | 
| Cloud Bigtable | bigtable.reader bigtable.user bigtable.viewer | 
| 结算 | billing.viewer | 
| Hangout Chats | chat.owner chat.reader | 
| Cloud Asset | cloudasset.owner cloudasset.viewer | 
| Cloud Data Fusion | datafusion.admin datafusion.viewer | 
| Cloud Debugger | clouddebugger.agent clouddebugger.user | 
| Cloud Functions | cloudfunctions.invoker cloudfunctions.viewer | 
| Cloud IAP | iap.admin iap.httpsResourceAccessor iap.settingsAdmin iap.tunnelResourceAccessor | 
| Cloud IoT | cloudiot.deviceController cloudiot.editor cloudiot.provisioner cloudiot.viewer | 
| Stackdriver Profiler | cloudprofiler.agent cloudprofiler.user | 
| Cloud Scheduler | cloudscheduler.admin cloudscheduler.jobRunner cloudscheduler.viewer | 
| Cloud Security Scanner | cloudsecurityscanner.editor cloudsecurityscanner.runner cloudsecurityscanner.viewer | 
| Cloud SQL | cloudsql.client cloudsql.editor cloudsql.viewer | 
| Cloud Trace | cloudtrace.admin cloudtrace.agent cloudtrace.user | 
| Dataflow | dataflow.developer dataflow.viewer dataflow.worker | 
| Dialogflow | dialogflow.admin dialogflow.client dialogflow.reader | 
| Cloud Data Loss Prevention | dlp.reader dlp.user | 
| Error Reporting | errorreporting.user errorreporting.viewer errorreporting.writer | 
| Eventarc | eventarc.publisher eventarc.eventReceiver | 
| Cloud Filestore | file.editor file.viewer | 
| 日志记录 | logging.configWriter logging.logWriter logging.privateLogViewer logging.viewer | 
| Machine Learning Engine | ml.developer ml.jobOwner ml.modelOwner ml.modelUser ml.operationOwner ml.viewer | 
| 监控 | monitoring.editor monitoring.metricWriter monitoring.viewer | 
| AI Notebooks | notebooks.admin notebooks.viewer | 
| Pub/Sub | pubsub.editor pubsub.publisher pubsub.subscriber pubsub.viewer | 
| Memorystore Redis | redis.editor redis.viewer | 
| Cloud Run | run.invoker | 
| 来源 | source.reader source.writer | 
| Cloud Spanner | spanner.databaseAdmin spanner.databaseReader spanner.databaseUser spanner.viewer | 
| Service Usage | serviceusage.apiKeysMetadataViewer | 
| Cloud Storage Transfer Service | storagetransfer.user storagetransfer.viewer | 
| Cloud Transcoder | transcoder.admin transcoder.viewer | 
| Vertex AI | aiplatform.user | 
| 其他 | identitytoolkit.admin identitytoolkit.viewer |