本頁面說明如何在向 Google API 提出 REST 要求時進行驗證。
如要瞭解如何在使用 Google 用戶端程式庫時進行驗證,請參閱「使用用戶端程式庫進行驗證」。
事前準備
如要執行本頁中的範例,請完成下列步驟:
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs:
gcloud services enable cloudresourcemanager.googleapis.com
iam.googleapis.com
如果您不想使用 gcloud CLI,可以略過這些步驟,並使用服務帳戶冒用或中繼資料伺服器來產生權杖。
憑證類型
您可以使用下列類型的憑證來驗證 REST 呼叫:
您的 gcloud CLI 憑證。
這是在本機開發環境中,為 REST 方法提供憑證最簡單且最安全的方式。如果使用者帳戶擁有所要呼叫方法的必要身分與存取權管理 (IAM) 權限,則建議採用這種做法。
您的 gcloud 憑證與您使用 gcloud CLI 提供給 ADC 的憑證不同。詳情請參閱 gcloud CLI 驗證設定和 ADC 設定。
-
在實際環境中驗證 REST 呼叫時,這個方法是首選做法,因為 ADC 會從程式碼執行所在的資源 (例如 Compute Engine 虛擬機器) 中找出憑證。您也可以使用 ADC 在本機開發環境中進行驗證。在這種情況下,gcloud CLI 會在本機檔案系統中建立含有憑證的檔案。
-
這個方法需要更多設定。如果您想使用現有憑證為其他服務帳戶取得短期憑證 (例如在本機使用服務帳戶進行測試或要求臨時提升權限),請使用這項方法。
-
這個方法只適用於可存取中繼資料伺服器的環境。中繼資料伺服器傳回的憑證與 應用程式預設憑證使用所附服務帳戶時所找到的憑證相同,但您會明確向中繼資料伺服器要求存取權杖,然後透過 REST 要求提供該權杖。如要查詢中繼資料伺服器的憑證,必須使用 HTTP GET 要求;這個方法不依賴 Google Cloud CLI。
-
您只能在接受 API 金鑰的 API 中,搭配 REST 要求使用 API 金鑰。此外,API 金鑰不得設有限制,以免無法與 API 搭配使用。
gcloud CLI 憑證
如要執行以下範例,您必須具備專案的 resourcemanager.projects.get
權限。resourcemanager.projects.get
權限包含在多種角色中,例如瀏覽器角色 (roles/browser
)。
使用
gcloud auth print-access-token
指令插入使用者憑證產生的存取權杖。以下範例會取得指定專案的詳細資料。您可以對任何 REST 要求使用相同的模式。
使用任何要求資料之前,請先替換以下項目:
PROJECT_ID
:您的 Google Cloud 專案 ID 或名稱。
如要傳送要求,請選擇以下其中一個選項:
curl
執行下列指令:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"PowerShell
執行下列指令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID" | Select-Object -Expand Content系統會傳回專案詳細資料。
對於需要配額專案的 API,您必須明確為要求設定一個專案。詳情請參閱本頁的「使用 REST 要求設定配額專案」一節。
應用程式預設憑證
如要執行下列範例,您向 ADC 提供的憑證相關聯的管理員必須具備專案的 resourcemanager.projects.get
權限。resourcemanager.projects.get
權限包含在多種角色中,例如瀏覽器角色 (roles/browser
)。
-
如果您在 Google Cloud 運算資源上執行,則不應將使用者憑證提供給 ADC。請改用已連結的服務帳戶提供憑證。詳情請參閱「為已附加服務帳戶的資源設定 ADC」。
使用
gcloud auth application-default print-access-token
指令,將 ADC 傳回的存取權杖插入 REST 要求中。以下範例會取得指定專案的詳細資料。您可以對任何 REST 要求使用相同的模式。
使用任何要求資料之前,請先替換以下項目:
PROJECT_ID
:您的 Google Cloud 專案 ID 或名稱。
如要傳送要求,請選擇以下其中一個選項:
curl
執行下列指令:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
"https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"PowerShell
執行下列指令:
$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID" | Select-Object -Expand Content系統會傳回專案詳細資料。
如果要求傳回的錯誤訊息指出此 API 不支援使用者憑證,請參閱本頁的「使用 REST 要求設定配額專案」一節。
模擬的服務帳戶
如要模擬服務帳戶產生存取權杖,最簡單的方式就是使用 gcloud CLI。不過,如果您需要以程式輔助方式產生權杖,或是不想使用 gcloud CLI,可以使用冒用身分功能產生短期權杖。
如要進一步瞭解如何模擬服務帳戶,請參閱「使用服務帳戶模擬功能」。
查看必要權限。
- 您要用於執行模擬作業的使用者,必須對模擬的服務帳戶 (也稱為具有特權的服務帳戶) 具備
iam.serviceAccounts.getAccessToken
權限。iam.serviceAccounts.getAccessToken
權限包含在「服務帳戶權杖建立者」角色 (roles/iam.serviceAccountTokenCreator
) 中。如果您使用的是使用者帳戶,即使您在專案中擁有「擁有者」角色 (roles/owner
),也必須新增這項權限。詳情請參閱「設定必要權限」。
- 您要用於執行模擬作業的使用者,必須對模擬的服務帳戶 (也稱為具有特權的服務帳戶) 具備
找出或建立具有權限的服務帳戶,也就是您要模擬的服務帳戶。
具備特權的服務帳戶必須具備發出 API 方法呼叫所需的權限。
gcloud
- 請使用
gcloud auth print-access-token
指令搭配--impersonate-service-account
旗標,將具有權限的服務帳戶存取權杖插入 REST 要求中。
以下範例會取得指定專案的詳細資料。您可以對任何 REST 要求使用相同的模式。
如要執行這個範例,您模擬的服務帳戶必須具備 resourcemanager.projects.get
權限。resourcemanager.projects.get
權限包含在多種角色中,例如瀏覽器角色 (roles/browser
)。
請將以下項目改為對應的值:
PRIV_SA
:具有特權的服務帳戶電子郵件地址。例如:[email protected]
。PROJECT_ID
:您的 Google Cloud 專案 ID 或名稱。
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token --impersonate-service-account=PRIV_SA)" \
"https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"
短期權杖
如要使用服務帳戶模擬作業產生短期權杖,請按照「建立短期存取權杖」一文中的操作說明進行。
中繼資料伺服器
如要從中繼資料伺服器取得存取權杖,您必須使用具備中繼資料伺服器存取權的其中一個服務發出 REST 呼叫:
- Compute Engine
- App Engine 標準環境
- App Engine 彈性環境
- Cloud Run 函式
- Cloud Run
- Google Kubernetes Engine
- Cloud Build
您可以使用 curl
等指令列工具取得存取權杖,然後將該權杖插入 REST 要求。
查詢中繼資料伺服器以取得存取權:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \ -H "Metadata-Flavor: Google"
要求會傳回類似以下的回應:
{ "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAi85nHq39HE3C2LTrCARA", "expires_in":3599, "token_type":"Bearer" }
將存取權杖插入 REST 要求中,並進行以下替換:
ACCESS_TOKEN
:上一個步驟傳回的存取權杖。PROJECT_ID
:您的 Google Cloud 專案 ID 或名稱。
curl -X GET \ -H "Authorization: Bearer ACCESS_TOKEN" \ "https://cloudresourcemanager.googleapis.com/v3/projects/PROJECT_ID"
API 金鑰
如要透過 REST API 呼叫加入 API 金鑰,請使用 x-goog-api-key
HTTP 標頭,如以下範例所示:
curl -X POST \ -H "X-goog-api-key: API_KEY" \ -H "Content-Type: application/json; charset=utf-8" \ -d @request.json \ "https://translation.googleapis.com/language/translate/v2"
如果您無法使用 HTTP 標頭,可以使用 key
查詢參數。不過,這種方法會在網址中加入 API 金鑰,因此金鑰可能會在網址掃描中遭竊。
以下範例說明如何在 documents.analyzeEntities
的 Cloud Natural Language API 要求中使用 key
查詢參數。將 API_KEY
替換為 API 金鑰的金鑰字串。
POST https://language.googleapis.com/v1/documents:analyzeEntities?key=API_KEY
使用 REST 要求設定配額專案
如要使用使用者憑證呼叫部分 API,您必須設定要計費的專案,並用於追蹤配額。如果 API 呼叫傳回的錯誤訊息指出系統不支援使用者憑證,或未設定配額專案,您必須明確設定要求的配額專案。如要設定配額專案,請在要求中加入 x-goog-user-project
標頭。
如要進一步瞭解可能會遇到這項問題的情況,請參閱「使用者憑證無法運作」。
您必須具備專案的 serviceusage.services.use
IAM 權限,才能將該專案指定為帳單專案。serviceusage.services.use
權限已納入服務使用情形消費者 IAM 角色。如果您沒有任何專案的 serviceusage.services.use
權限,請與安全性管理員或專案擁有者聯絡,請對方為您授予專案中的「服務用量使用者」角色。
以下範例使用 Cloud Translation API 將「hello」一詞翻譯成西班牙文。Cloud Translation API 是需要指定配額專案的 API。如要執行範例,請建立名為 request.json
的檔案,並在其中加入要求主體內容。
使用任何要求資料之前,請先替換以下項目:
- PROJECT_ID:要用於計費專案的 Google Cloud 專案 ID 或名稱。
JSON 要求主體:
{ "q": "hello", "source": "en", "target": "es" }
如要傳送要求,請選擇以下其中一個選項:
curl
將要求主體儲存在名為 request.json
的檔案中,然後執行下列指令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: PROJECT_ID" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://translation.googleapis.com/language/translate/v2"
PowerShell
將要求主體儲存在名為 request.json
的檔案中,然後執行下列指令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://translation.googleapis.com/language/translate/v2" | Select-Object -Expand Content
翻譯要求成功。您可以嘗試不使用 x-goog-user-project
HTTP 標頭的指令,看看不指定結帳專案時會發生什麼情況。
後續步驟
- 請參閱驗證總覽。
- 瞭解如何使用用戶端程式庫進行驗證。
- 瞭解 gcloud CLI 驗證設定和 ADC 設定 。