驗證總覽

這個頁面提供應用程式開發人員在 Google Cloud Platform (GCP) 中進行驗證的總覽資訊,包括主體、應用程式憑證,以及驗證對 GCP API 呼叫的不同方式。

簡介

GCP API 的存取權控管機制中包含驗證、授權和稽核。驗證會判斷您的身分,授權決定您可以執行哪些操作,稽核記錄則會記下您的操作相關資訊。

這個頁面著重於驗證作業。如需授權相關資訊,請參閱 Cloud Identity and Access Management (Cloud IAM)。如需稽核相關資訊,請參閱 Cloud 稽核記錄

主體

主體是可以取得資源存取權的實體,也稱為「身分」。GCP API 支援以下兩種主體:「使用者帳戶」和「服務帳戶」

系統會將使用者帳戶視為 Google 帳戶來管理,使用者帳戶代表了開發人員、管理員或任何其他與 GCP 互動的使用者。這類帳戶適用於應用程式必須代表真人使用者存取資源的情境。

服務帳戶由 Cloud IAM 代管,代表了非真人使用者。這類帳戶適用於應用程式必須自行存取資源或執行操作 (例如執行 App Engine 應用程式或與 Compute Engine 執行個體互動) 的情境。

如要進一步瞭解各個帳戶類型,請參閱 Cloud IAM 總覽

應用程式

GCP API 僅接受已註冊應用程式發出的要求,這類應用程式具備不重複識別性,並會在發出要求時提供憑證。系統會拒絕匿名應用程式發出的要求。

呼叫端向 GCP API 發出要求時,應用程式憑證會提供該呼叫端的相關必要資訊。有效的憑證類型包括 API 金鑰OAuth 2.0 用戶端憑證服務帳戶金鑰。服務帳戶可以當做應用程式憑證或主體身分使用,因此不得重複。詳情請參閱瞭解服務帳戶

如果您在向 GCP API 發出的要求中提供應用程式憑證,系統只會將呼叫端識別為已註冊的應用程式。如果需要進行驗證,則用戶端必須一併識別執行應用程式的主體,例如使用者帳戶或服務帳戶。下列章節將會說明這項程序。

驗證策略

GCP API 會使用 OAuth 2.0 通訊協定來驗證使用者帳戶和服務帳戶。OAuth 2.0 驗證程序可以判斷主體和應用程式。

另外,大多數 GCP API 也支援透過 API 金鑰匿名存取公開資料,不過 API 金鑰只能識別應用程式,而無法辨識主體。因此,使用 API 金鑰時,您必須透過其他方式驗證主體。

針對不同的執行階段環境,GCP API 支援多項驗證流程。建議您使用 Google Cloud 用戶端程式庫來搭配 GCP API,以便獲得最佳開發人員體驗。GCP API 會使用 Google 提供的驗證資料庫,這類資料庫支持多種驗證流程和執行階段環境。

如要使用 GCP API 建構應用程式,請按照下列通用步驟操作:

  • 選擇並使用我們提供的 Cloud 用戶端程式庫
  • 找出適合應用程式的驗證流程
  • 搜尋或建立應用程式所需的應用程式憑證
  • 在應用程式啟動時,盡可能透過應用程式預設憑證 (ADC) 將應用程式憑證傳送至用戶端程式庫

我們會建議您依據應用程式的需求和運作位置選取應用程式憑證。下表提供常見需求的幾個通用建議做法:

需求 建議做法 註解
以匿名方式存取公開資料 使用 API 金鑰 API 金鑰只會識別應用程式,因此不需要進行使用者驗證即可存取公開資料。
代表使用者存取私人資料 使用 OAuth 2.0 用戶端 OAuth 2.0 用戶端可以識別應用程式,並讓使用者透過 Google 驗證您的應用程式。另外,這種用戶端也允許應用程式代表使用者存取 GCP API。
在 GCP 環境中代表服務帳戶存取私人資料 使用所屬環境提供的服務帳戶 如果您的應用程式是在 Compute Engine、App Engine、GKE、Cloud Run 或 Cloud Functions 等 GCP 環境中運作,則該應用程式應使用所屬環境提供的服務帳戶。
Cloud 用戶端程式庫會自動搜尋及使用服務帳戶的憑證。
代表 GCP 環境以外的服務帳戶存取私人資料 使用服務帳戶金鑰 您必須建立服務帳戶,並以 JSON 檔案的形式下載其私密金鑰。您必須將檔案傳送給 Cloud 用戶端程式庫,讓程式庫在執行階段中產生服務帳戶憑證。

Cloud 用戶端程式庫會透過 GOOGLE_APPLICATION_CREDENTIALS 環境變數自動搜尋及使用服務帳戶的憑證。

範例

下列程式碼範例呈現了如何在 Go 中透過 Cloud 用戶端程式庫採用不同的驗證策略,其他程式語言的開發人員體驗與此相差無幾。

服務帳戶金鑰

import (
	"context"
	"fmt"

	"cloud.google.com/go/pubsub"
)

// serviceAccount shows how to use a service account to authenticate.
func serviceAccount() error {
	// Download service account key per https://cloud.google.com/docs/authentication/production.
	// Set environment variable GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
	// This environment variable will be automatically picked up by the client.
	client, err := pubsub.NewClient(context.Background(), "your-project-id")
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %v", err)
	}
	// Use the authenticated client.
	_ = client

	return nil
}
詳情請參閱驗證伺服器應用程式

環境服務帳戶

import (
	"context"
	"fmt"

	"cloud.google.com/go/pubsub"
)

// envServiceAccount shows how to use an environment-provided service account to authenticate.
func envServiceAccount() error {
	// If your application runs in a GCP environment, such as Compute Engine,
	// you don't need to provide any application credentials. The client
	// library will find the credentials by itself.
	client, err := pubsub.NewClient(context.Background(), "your-project-id")
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %v", err)
	}
	// Use the authenticated client.
	_ = client

	return nil
}
詳情請參閱驗證伺服器應用程式

OAuth 2.0 用戶端

import (
	"context"
	"fmt"
	"os"

	"cloud.google.com/go/pubsub"
	"golang.org/x/oauth2"
	"golang.org/x/oauth2/google"
	"google.golang.org/api/option"
)

// oauthClient shows how to use an OAuth client ID to authenticate as an end-user.
func oauthClient() error {
	ctx := context.Background()

	// Please make sure the redirect URL is the same as the one you specified when you
	// created the client ID.
	redirectURL := os.Getenv("OAUTH2_CALLBACK")
	if redirectURL == "" {
		redirectURL = "your redirect url"
	}
	config := &oauth2.Config{
		ClientID:     "your-client-id",
		ClientSecret: "your-client-secret",
		RedirectURL:  redirectURL,
		Scopes:       []string{"email", "profile"},
		Endpoint:     google.Endpoint,
	}

	// Dummy authorization flow to read auth code from stdin.
	authURL := config.AuthCodeURL("your state")
	fmt.Printf("Follow the link in your browser to obtain auth code: %s", authURL)

	// Read the authentication code from the command line
	var code string
	fmt.Scanln(&code)

	// Exchange auth code for OAuth token.
	token, err := config.Exchange(ctx, code)
	if err != nil {
		return fmt.Errorf("config.Exchange: %v", err)
	}
	client, err := pubsub.NewClient(ctx, "your-project-id", option.WithTokenSource(config.TokenSource(ctx, token)))

	// Use the authenticated client.
	_ = client

	return nil
}
詳情請參閱以使用者的身分進行驗證

API 金鑰

import (
	"context"
	"fmt"

	"cloud.google.com/go/pubsub"
	"google.golang.org/api/option"
)

// apiKey shows how to use an API key to authenticate.
func apiKey() error {
	client, err := pubsub.NewClient(context.Background(), "your-project-id", option.WithAPIKey("api-key-string"))
	if err != nil {
		return fmt.Errorf("pubsub.NewClient: %v", err)
	}
	// Use the authenticated client.
	_ = client

	return nil
}
詳情請參閱使用 API 金鑰
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁