為了讓擴充功能執行指定動作,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 bucket 互動。
storage.objectCreator角色可讓擴充功能在 Cloud Storage 值區中建立物件,但無法檢視、刪除或覆寫物件。如要讓擴充功能執行這些額外動作,請改為指派storage.objectAdmin角色。
請參閱本頁面底部的章節,查看可指派給擴充功能服務帳戶的所有支援角色。如要瞭解各個角色的說明和授予的權限,請參閱 Firebase 說明文件或 Google Cloud 說明文件。您也可以在 Google Cloud 控制台的「IAM & Admin」(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 bucket,您可以使用下列角色:
roles:
  - role: storage.objectCreator
    reason: Needed in order to write
    resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}
這樣一來,擴充功能就只會存取所需的 bucket,而不會存取同一專案中的其他 bucket。
這個欄位支援專案 (projects/{project_id}) 和 Storage bucket (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 | 
    
| Hangouts Chat | 
        chat.owner chat.reader  | 
    
| 雲端資產 | 
        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  | 
    
| 服務使用情形 | serviceusage.apiKeysMetadataViewer | 
    
| Cloud Storage 移轉服務 | 
        storagetransfer.user storagetransfer.viewer  | 
    
| Cloud Transcoder | 
        transcoder.admin transcoder.viewer  | 
    
| Vertex AI | aiplatform.user | 
    
| 其他 | 
        identitytoolkit.admin identitytoolkit.viewer  |