身份验证概览

本页面简要介绍了 Google Cloud 的应用开发者平台中进行的身份验证。其中还介绍了主帐号、应用凭据以及对 Google Cloud API 调用进行身份验证的各种方法。

简介

Google Cloud API 的访问权限控制包括身份验证、授权和审核。身份验证可识别您的身份,授权决定了您可以执行的操作,而审核日志则记录您执行过的操作。

本页面重点介绍身份验证。如需了解授权相关信息,请参阅 Identity and Access Management (IAM)。如需了解审核相关信息,请参阅 Cloud Audit Logs

主帐号

主帐号是一种实体(也称为身份),可被授予资源访问权限。Google Cloud API 支持两种类型的主帐号:用户帐号和服务帐号

  • 用户帐号作为 Google 帐号进行管理,代表开发者、管理员或与 Google Cloud 进行交互的任何其他人员。如果您的应用需要代表人类用户访问资源,则使用用户帐号。如需了解详情,请参阅以最终用户身份进行身份验证

  • 服务帐号IAM 管理,代表非人类用户。如果您的应用需要代表自己访问资源或执行操作,例如运行 App Engine 应用或与 Compute Engine 实例交互,则使用服务帐号。如需了解详情,请参阅以服务帐号身份进行身份验证

如需详细了解每种帐号类型,请参阅 IAM 概览

应用

Google Cloud API 仅接受来自已注册应用的请求,它们是在发送请求时递交凭据、可唯一标识的应用。来自匿名应用的请求会遭到拒绝。

应用凭据提供向 Google Cloud API 发出请求的调用方的必要信息。有效凭据类型包括 API 密钥OAuth 2.0 客户端凭据服务帐号密钥。服务帐号具有唯一性,因为它们既可用作应用凭据,也可用作主帐号身份。如需了解详情,请参阅了解服务帐号

在向 Google Cloud API 发出的请求中递交应用凭据只能将调用方标识为已注册的应用;如果需要进行身份验证,则客户端还必须标识运行应用的主帐号,例如用户帐号或服务帐号。下面部分会介绍此过程。

身份验证策略

Google Cloud API 使用 OAuth 2.0 协议对用户帐号和服务帐号进行身份验证。OAuth 2.0 身份验证过程会确定主帐号和应用。

大多数 Google Cloud API 还支持使用 API 密钥匿名访问公共数据。但是,API 密钥只能标识应用,而不能标识主帐号。 使用 API 密钥时,主帐号必须通过其他方式进行身份验证。

Google Cloud API 支持适合不同运行时环境的多个身份验证流程。为了获得最佳的开发者体验,我们建议将 Google Cloud 客户端库与 Google Cloud API 结合使用。Google Cloud API 使用 Google 提供的身份验证库,这些库支持各种身份验证流程和运行时环境。

如需使用 Google Cloud API 构建应用,请按照以下常规步骤操作:

  • 选择并使用提供的 Google Cloud 客户端库
  • 为您的应用确定正确的身份验证流程
  • 查找或创建应用所需的应用凭据
  • 在应用启动时将应用凭据传递给客户端库,最好通过应用默认凭据 (ADC) 传递

您应该根据应用的需要和运行位置来选择应用凭据。下表就常见要求提供了一些常规建议:

要求 建议 备注
匿名访问公共数据 API 密钥 API 密钥仅标识应用,不需要用户身份验证。足以访问公开数据。
代表最终用户访问私有数据 OAuth 2.0 客户端 OAuth 2.0 客户端标识应用,并允许最终用户通过 Google 对您的应用进行身份验证。它允许您的应用代表最终用户访问 Google Cloud API。
在 Google Cloud 环境中代表服务帐号访问私有数据 环境提供的服务帐号 如果您的应用在 Google Cloud 环境(如 Compute Engine、App Engine、GKE、Cloud Run 或 Cloud Functions)中运行,则应用应使用该环境提供的服务帐号。

Google Cloud 客户端库将自动查找并使用服务帐号凭据。
在 Google Cloud 环境之外代表服务帐号访问私有数据 服务帐号密钥 您需要创建一个服务帐号,并将其私钥下载为 JSON 文件。您需要将文件传递给 Google Cloud 客户端库,以便它们在运行时生成服务帐号凭据。

Google Cloud 客户端库将使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量自动查找和使用服务帐号凭据。

示例

以下代码示例使用 Go 语言版本的 Pub/Sub 客户端库演示了如何使用不同的身份验证策略。此过程对其他语言的开发者几乎相同。

服务帐号密钥

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 密钥

后续步骤