認証の概要

このページでは、Google Cloud のアプリケーション デベロッパー向けプラットフォーム(旧称 Google Cloud Platform、GCP)での認証の概要について説明します。プリンシパル、アプリケーションの認証情報、さまざまな Google Cloud APIs 呼び出しの認証方法について説明します。

はじめに

Google Cloud APIs のアクセス制御には、認証、認可、監査があります。認証はユーザーを識別することであり、認可はユーザーの行える内容を決定することです。また、ユーザーの行ったことを監査ログに記録します。

このページでは、特に認証について説明します。認可については、Identity and Access Management(IAM)をご覧ください。監査については、Cloud Audit Logs をご覧ください。

プリンシパル

プリンシパルは、リソースへのアクセスを許可できるエンティティであり、ID とも呼ばれます。Google Cloud APIs では、ユーザー アカウントとサービス アカウントの 2 種類のプリンシパルをサポートします。

  • ユーザー アカウントGoogle アカウントとして管理され、Google Cloud を利用するデベロッパー、管理者、その他のユーザーを表します。これは、アプリケーションが人間のユーザーに代わってリソースにアクセスする必要がある場合を対象としています。詳細については、エンドユーザーとして認証するをご覧ください。

  • サービス アカウントIAM によって管理されるもので、人間のユーザー以外のものを指しています。App Engine アプリの実行や Compute Engine インスタンスとのやり取りなど、アプリケーション自体がリソースにアクセスする場合や、アクションを独自に実行する必要がある場合を対象としています。詳細については、サービス アカウントとして認証するをご覧ください。

各アカウント タイプの詳細については、IAM の概要をご覧ください。

アプリケーション

Google Cloud APIs は、登録されたアプリケーションからのリクエストのみを受け付けます。登録されたアプリケーションは、一意に識別可能なアプリケーションで、リクエストの際に認証情報を提示します。匿名のアプリケーションからのリクエストは拒否されます。

アプリケーションの認証情報は、Google Cloud API にリクエストを送信する呼び出し側に関する必要な情報を提供します。有効な認証情報タイプには、API キーOAuth 2.0 クライアント資格情報サービス アカウント キーがあります。サービス アカウントは、アプリケーションの認証情報またはプリンシパル ID のいずれにも使用される場合があり、一意なものとなっています。詳細については、サービス アカウントについてをご覧ください。

呼び出し側が登録済みアプリケーションとして識別されるのは、Google Cloud APIs へのリクエストでアプリケーション認証情報が示されたときだけです。認証が必要な場合、クライアントはユーザー アカウントやサービス アカウントなど、アプリケーションを実行しているプリンシパルも特定する必要があります。このプロセスについては、以下のセクションで説明します。

認証ストラテジー

Google Cloud APIs では、ユーザー アカウントとサービス アカウントの認証の両方に、OAuth 2.0 プロトコルが使用されます。OAuth 2.0 を使用した認証プロセスにより、プリンシパルとアプリケーションの両方を識別します。

ほとんどの Google Cloud APIs で、API キーを使用した一般公開データへの匿名アクセスがサポートされています。ただし、API キーはアプリケーションのみを識別し、プリンシパルは識別しません。API キーを使用する場合には、プリンシパルを他の方法で認証する必要があります。

Google Cloud APIs では、さまざまなランタイム環境を対象に複数の認証フローがサポートされています。デベロッパーに最適な環境とするには、Google Cloud APIs で Google Cloud クライアント ライブラリを使用することをおすすめします。Google Cloud クライアント ライブラリは Google が提供する認証ライブラリで、さまざまな認証フローとランタイム環境がサポートされています。

Google Cloud APIs を使用してアプリケーションを構築するには、次の一般的な手順に従います。

  • 提供された Google Cloud クライアント ライブラリを選択して使用する
  • アプリケーションに適した認証フローを決定する
  • アプリケーションに必要な認証情報を確認または作成する
  • アプリケーションの起動時に、アプリケーションの認証情報をクライアント ライブラリに渡す。アプリケーションのデフォルト認証情報(ADC)を使用するのが理想的です。

アプリケーションに求められる内容と実行される場面に基づいて、アプリケーションの認証情報を選択する必要があります。次の表に、一般的な要件を想定した場合に推奨される方法について示します。

要件 推奨 コメント
一般公開データに匿名でアクセスする API キー API キーはアプリケーションを識別するだけであり、ユーザー認証は必要とされません。一般公開データへのアクセスには、これで十分です。
エンドユーザーに代わって限定公開データにアクセスする OAuth 2.0 クライアント OAuth 2.0 クライアントによりアプリケーションが識別され、Google でアプリケーションを認証できるようになります。これにより、アプリケーションがエンドユーザーに代わって Google Cloud APIs にアクセスできます。
Google Cloud 環境内でサービス アカウントに代わって限定公開データにアクセスする 環境提供のサービス アカウント Compute Engine、App Engine、GKE、Cloud Run、Cloud Functions などの Google Cloud 環境内でアプリケーションを実行する場合、アプリケーションはその環境で提供されるサービス アカウントを使用する必要があります。

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 キーの使用をご覧ください。

次のステップ