驗證 REST 使用權限

本頁面說明如何在向 Google API 提出 REST 要求時進行驗證。

如要瞭解如何在使用 Google 用戶端程式庫時進行驗證,請參閱「使用用戶端程式庫進行驗證」。

事前準備

如要執行本頁中的範例,請完成下列步驟:

  1. Install the Google Cloud CLI.

  2. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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 設定

  • 提供給應用程式預設憑證 (ADC) 的憑證

    在實際環境中驗證 REST 呼叫時,這個方法是首選做法,因為 ADC 會從程式碼執行所在的資源 (例如 Compute Engine 虛擬機器) 中找出憑證。您也可以使用 ADC 在本機開發環境中進行驗證。在這種情況下,gcloud CLI 會在本機檔案系統中建立含有憑證的檔案。

  • 模擬服務帳戶提供的憑證

    這個方法需要更多設定。如果您想使用現有憑證為其他服務帳戶取得短期憑證 (例如在本機使用服務帳戶進行測試或要求臨時提升權限),請使用這項方法。

  • 中繼資料伺服器傳回的憑證

    這個方法只適用於可存取中繼資料伺服器的環境。中繼資料伺服器傳回的憑證與 應用程式預設憑證使用所附服務帳戶時所找到的憑證相同,但您會明確向中繼資料伺服器要求存取權杖,然後透過 REST 要求提供該權杖。如要查詢中繼資料伺服器的憑證,必須使用 HTTP GET 要求;這個方法不依賴 Google Cloud CLI。

  • API 金鑰

    您只能在接受 API 金鑰的 API 中,搭配 REST 要求使用 API 金鑰。此外,API 金鑰不得設有限制,以免無法與 API 搭配使用。

gcloud CLI 憑證

如要執行以下範例,您必須具備專案的 resourcemanager.projects.get 權限。resourcemanager.projects.get 權限包含在多種角色中,例如瀏覽器角色 (roles/browser)。

  1. 使用 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)。

  1. 將憑證提供給 ADC

    如果您在 Google Cloud 運算資源上執行,則不應將使用者憑證提供給 ADC。請改用已連結的服務帳戶提供憑證。詳情請參閱「為已附加服務帳戶的資源設定 ADC」。

  2. 使用 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,可以使用冒用身分功能產生短期權杖。

如要進一步瞭解如何模擬服務帳戶,請參閱「使用服務帳戶模擬功能」。

  1. 查看必要權限。

    • 您要用於執行模擬作業的使用者,必須對模擬的服務帳戶 (也稱為具有特權的服務帳戶) 具備 iam.serviceAccounts.getAccessToken 權限。iam.serviceAccounts.getAccessToken 權限包含在「服務帳戶權杖建立者」角色 (roles/iam.serviceAccountTokenCreator) 中。如果您使用的是使用者帳戶,即使您在專案中擁有「擁有者」角色 (roles/owner),也必須新增這項權限。詳情請參閱「設定必要權限」。
  2. 找出或建立具有權限的服務帳戶,也就是您要模擬的服務帳戶。

    具備特權的服務帳戶必須具備發出 API 方法呼叫所需的權限。

gcloud

  1. 請使用 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 呼叫:

您可以使用 curl 等指令列工具取得存取權杖,然後將該權杖插入 REST 要求。

  1. 查詢中繼資料伺服器以取得存取權:

    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"
     }
    
  2. 將存取權杖插入 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 標頭的指令,看看不指定結帳專案時會發生什麼情況。

後續步驟