認証の概要

このページでは、アプリケーションのデベロッパーを対象に、Google Cloud Platform(GCP)での認証の概要について説明します。プリンシパル、アプリケーションの認証情報、GCP API への呼び出しを認証する際の複数の方法について説明します。

はじめに

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

このページでは、特に認証について説明します。承認については、Cloud Identity and Access Management(Cloud IAM)をご覧ください。監査については、クラウド監査ログをご覧ください。

プリンシパル

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

ユーザー アカウントは Google アカウントとして管理され、デベロッパー、管理者、GCP とやり取りするユーザーのことを指しています。アプリケーションが人間のユーザーに代わってリソースにアクセスする必要がある場合を対象としています。

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

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

アプリケーション

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

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

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

認証ストラテジー

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

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

GCP API では、さまざまなランタイム環境を対象に複数の認証フローがサポートされています。デベロッパーに最適な環境とするには、GCP API で Google Cloud クライアント ライブラリを使用することをおすすめします。Google Cloud クライアント ライブラリは 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 キーの使用をご覧ください。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...