本頁說明取得 Google 簽署的 OpenID Connect (OIDC) ID 權杖的部分方式。
如要瞭解 ID 權杖內容和生命週期,請參閱「ID 權杖」。
身分符記只能用於特定服務或應用程式,這類服務或應用程式是由 aud 聲明的值指定。本文使用「目標服務」一詞,是指可用於驗證身分 ID 權杖的服務或應用程式。
取得 ID 權杖後,您可以在向目標服務提出要求的 Authorization 標頭中加入該權杖。
取得 ID 權杖的方法
您可以透過多種方式取得 ID 權杖。本頁面說明下列方法:
如果應用程式並非託管於Google Cloud,但您需要應用程式接受 ID 權杖,或許可以使用這些方法。不過,您應判斷應用程式需要哪些 ID 權杖聲明。
從中繼資料伺服器取得 ID 權杖
如果程式碼在可附加服務帳戶的資源上執行,相關聯服務的中繼資料伺服器通常會提供 ID 權杖。中繼資料伺服器會為附加的服務帳戶產生 ID 權杖。您無法從中繼資料伺服器取得以使用者憑證為依據的 ID 權杖。
當程式碼在下列 Google Cloud 服務上執行時,您可以從中繼資料伺服器取得 ID 權杖:
如要從中繼資料伺服器擷取 ID 權杖,請查詢服務帳戶的身分識別端點,如本範例所示。
curl
將 AUDIENCE 替換為目標服務的 URI,例如 http://www.example.com。
curl -H "Metadata-Flavor: Google" \ 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE'
PowerShell
將 AUDIENCE 替換為目標服務的 URI,例如 http://www.example.com。
$value = (Invoke-RestMethod `
-Headers @{'Metadata-Flavor' = 'Google'} `
-Uri "http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE")
$value
Java
如要執行這個程式碼範例,請安裝 Java 專用的 Auth 用戶端程式庫。
Go
Node.js
如要執行這個程式碼範例,您必須安裝 Node.js 適用的 Google Auth 程式庫。
Python
如要執行這個程式碼範例,請先安裝 Google Auth Python 程式庫。
Ruby
如要執行這個程式碼範例,請務必安裝 Ruby 適用的 Google Auth 程式庫。
使用連結服務產生 ID 權杖
部分 Google Cloud 服務可協助您呼叫其他服務。這些連結服務可能有助於判斷通話時間,或管理包含呼叫服務的工作流程。下列服務在啟動對需要 ID 權杖的服務的呼叫時,可以自動加入 ID 權杖,並為 aud 聲明提供適當的值:
- Pub/Sub
- Pub/Sub 可讓服務之間進行非同步通訊。 您可以設定 Pub/Sub,在訊息中加入 ID 權杖。詳情請參閱「 推送訂閱項目驗證」。
模擬服務帳戶來產生 ID 權杖
服務帳戶模擬功能可讓主體為信任的服務帳戶產生短期憑證。主體隨後可以使用這些憑證,以服務帳戶的身分進行驗證。
主體必須先在服務帳戶中擁有可模擬的角色,才能模擬該服務帳戶。如果主體是另一個服務帳戶,直接為該服務帳戶提供必要權限,並允許該服務帳戶模擬自身身分,似乎會比較簡單。這種設定稱為「自我模擬」,會造成安全漏洞,因為服務帳戶可以建立可無限期重新整理的存取權杖。
服務帳戶模擬功能一律會涉及兩個主體:代表呼叫者的主體,以及要模擬的服務帳戶 (稱為具備權限的服務帳戶)。
如要模擬服務帳戶來產生 ID 權杖,請使用下列一般程序。
如需逐步操作說明,請參閱「建立 ID 權杖」。
找出或建立服務帳戶,做為具有權限的服務帳戶。
- 請參閱產品說明文件,找出叫用目標服務所需的角色。在目標服務中,將這些角色授予服務帳戶。
找出要執行模擬作業的主體,並設定應用程式預設憑證 (ADC),以便使用這個主體的憑證。
在開發環境中,主體通常是您使用 gcloud CLI 提供給 ADC 的使用者帳戶。不過,如果您在附加服務帳戶的資源上執行作業,附加的服務帳戶就是主體。
授予主體服務帳戶 OpenID Connect 身分識別權杖建立者角色 (
roles/iam.serviceAccountOpenIdTokenCreator)。使用 IAM Credentials API 為已授權的服務帳戶產生 ID 權杖。
更改下列內容:
- AUDIENCE:目標服務的 URI,例如
http://www.example.com。 - SERVICE_ACCOUNT_EMAIL:具有權限的服務帳戶電子郵件地址。
curl -X POST \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -d '{"audience": "AUDIENCE", "includeEmail": "true"}' \ https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken- AUDIENCE:目標服務的 URI,例如
後續步驟
- 瞭解 ID 權杖。
- 使用殼層指令查詢 Compute Engine 中繼資料伺服器。
- 進一步瞭解驗證方式。