Cloud Storage の認証

Cloud Storage で実行するほとんどのオペレーションは認証される必要があります。唯一の例外は、匿名アクセスが許可されているオブジェクトに対するオペレーションです。allUsers グループに READ 権限がある場合は、オブジェクトに匿名でアクセスできます。allUsers グループには、インターネット上のすべての人が含まれます。

OAuth 2.0

認証

Cloud Storage は、OAuth 2.0 を使って API の認証と承認を行います。認証は、クライアントの身元を確認する処理です。認証の詳細は、Cloud Storage へのアクセス方法によって変わりますが、一般的に以下の 2 種類のいずれかになります。

  • サーバー中心のフローでは、認証を行うためのサービス アカウントの認証情報を、アプリケーションが直接保持します。このフローは、アプリケーションがユーザーデータではなくアプリケーション自体のデータを処理する場合に使用します。Google Cloud Platform プロジェクトでは、デフォルト サービス アカウントを使用するか、新しいサービス アカウントを作成できます。

  • ユーザー中心のフローでは、アプリケーションがエンドユーザーから認証情報を取得できます。ユーザーは、認証を完了するためにログインします。このフローは、アプリケーションがユーザーデータにアクセスする必要がある場合に使用します。ユーザー中心のフローが適しているシナリオについては、このページで後述するユーザー アカウント認証情報のセクションをご覧ください。

両方の種類の認証を 1 つのアプリケーションで使用できることができます。認証の詳しい背景情報については、Google Cloud Platform Auth ガイドをご覧ください。

スコープ

承認は、認証されたユーザーが、指定のリソースに対してどのような権限を持つかを判定する処理です。OAuth では、認証されたユーザーを承認するかどうかを判定するために、スコープを使用します。アプリケーションは認証情報(ユーザー中心の認証フローやサーバー中心の認証フローで取得したもの)と、1 つ以上のスコープを使って、保護されたリソースにアクセスするためのアクセス トークンを Google 承認サーバーに要求します。たとえば、スコープが read-only のアクセス トークンを持つアプリケーション A は読み取りのみが可能ですが、スコープが read-write のアクセス トークンを持つアプリケーション B は、データの読み取りと変更を行うことができます。どちらのアプリケーションも、オブジェクトとバケットのアクセス制御リストの読み取りと変更はできません。それができるのは、full-control のスコープを持つアプリケーションだけです。

タイプ 説明 スコープの URL
read-only バケットの一覧表示を含め、データを読み取るためのアクセスのみを許可します。 https://www.googleapis.com/auth/devstorage.read_only
read-write データの読み取りと変更のアクセスは許可しますが、IAM ポリシーなどのメタデータへのアクセスは許可しません。 https://www.googleapis.com/auth/devstorage.read_write
full-control IAM ポリシーの変更を含め、データに対するフル コントロールを許可します。 https://www.googleapis.com/auth/devstorage.full_control
cloud-platform.read-only Google Cloud Platform サービス全体のデータを表示します。Cloud Storage では、これは devstorage.read-only と同じです。 https://www.googleapis.com/auth/cloud-platform.read-only
cloud-platform すべての Google Cloud Platform サービスにわたるデータを表示して管理します。Cloud Storage では、これは devstorage.full-control と同じです。 https://www.googleapis.com/auth/cloud-platform

gsutil 認証

gsutilCloud SDK からインストールした場合、ユーザー アカウント認証情報かサービス アカウント認証情報を使用して認証できます。

サービス アカウント認証情報を使用する

  1. 既存のサービス アカウントを使用するか、新規サービス アカウントを作成し、必要な秘密鍵をダウンロードします。

  2. gcloud auth activate-service-account を使い、サービス アカウントを使用して認証します。

    gcloud auth activate-service-account --key-file [KEY_FILE]
    

    [KEY_FILE] は、サービス アカウント認証情報を含むファイルの名前です。

ユーザー アカウント認証情報を使用する

gcloud auth application-default login を使い、ユーザー アカウント認証情報を使用して認証します。

gcloud auth application-default login

gcloud auth は、アクセス トークンを取得するときに、cloud-platform スコープを使用します。

gsutil を Cloud SDK とは独立してインストールした場合は、gsutil のインストール ページで、ユーザー アカウントやサービス アカウントを使って認証する方法を確認してください。

クライアント ライブラリの認証

クライアント ライブラリは、アプリケーションのデフォルト認証情報を使うことによって、Google API で簡単に認証を行い、これら API にリクエストを送信することができます。アプリケーションのデフォルト認証情報により、ローカルでアプリケーションのテストを行い、基本となるコードを変更することなくアプリケーションを導入できるようになります。コードのサンプルを含む、詳しい情報は、Google Cloud Platform Auth ガイドをご覧ください。

アプリケーションのデフォルトの認証情報は、Cloud Storage へのアクセスに使用できるクライアント ライブラリの一部です。デフォルト認証情報は、ユーザー認証情報またはデフォルト サーバー アカウントを使ってアプリケーションを識別します。ライブラリを使用するときには、コードを実行する環境の種類に基づいて認証情報を選ぶのが一般的です。

環境の初期化

ローカル開発環境

ローカル開発環境を初期化するために、Google Cloud SDK を使ってユーザー認証情報で認証できます。Linux/Mac OS X では、次のスクリプトを使います。

curl https://sdk.cloud.google.com | bash
インストールすると、独自のユーザー アカウント認証情報をプロキシとして使い、次のコマンドを実行することでローカルマシンから API を呼び出すコードをテストできます。
gcloud auth application-default login
このコマンドは、cloud-platform スコープを使用してアクセス トークンを要求します。

Google Cloud Platform

Google App Engine または Google Compute Engine でアプリケーションを実行している場合は、環境内でサービス アカウントの認証情報がすでに用意されているため、それ以上の設定は必要ありません。Compute Engine の場合、サービス アカウントのスコープは、インスタンスを作成した方法に依存します。インスタンスに対するサービス アカウント アクセスのスコープの設定をご覧ください。App Engine では cloud-platform スコープが使用されます。

その他の環境

Google Cloud Platform の外部の本番環境では、環境変数を通じてサービス アカウントの認証情報を指定し、スコープはコード内に設定されます。詳細については、アプリケーションのデフォルト認証情報の仕組みサービス アカウントの作成をご覧ください。

アプリケーションのデフォルト認証情報の使用例

C#

using Google.Cloud.Storage.V1;
using System;
using System.Diagnostics;

namespace GoogleCloudSamples
{
    class StorageQuickstart
    {
        static void Main(string[] args)
        {
            // Your Google Cloud Platform project ID.
            string projectId = "YOUR-PROJECT-ID";

            // Instantiates a client.
            StorageClient storageClient = StorageClient.Create();

            // The name for the new bucket.
            string bucketName = projectId + "-test-bucket";
            try
            {
                // Creates the new bucket.
                storageClient.CreateBucket(projectId, bucketName);
                Console.WriteLine($"Bucket {bucketName} created.");
            }
            catch (Google.GoogleApiException e)
            when (e.Error.Code == 409)
            {
                // The bucket already exists.  That's fine.
                Console.WriteLine(e.Error.Message);
            }
        }
    }
}

Go

// Sample storage-quickstart creates a Google Cloud Storage bucket.
package main

import (
	"context"
	"fmt"
	"log"

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

func main() {
	ctx := context.Background()

	// Sets your Google Cloud Platform project ID.
	projectID := "YOUR_PROJECT_ID"

	// Creates a client.
	client, err := storage.NewClient(ctx)
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}

	// Sets the name for the new bucket.
	bucketName := "my-new-bucket"

	// Creates a Bucket instance.
	bucket := client.Bucket(bucketName)

	// Creates the new bucket.
	if err := bucket.Create(ctx, projectID, nil); err != nil {
		log.Fatalf("Failed to create bucket: %v", err)
	}

	fmt.Printf("Bucket %v created.\n", bucketName)
}

Java

// Imports the Google Cloud client library
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class QuickstartSample {
  public static void main(String... args) throws Exception {
    // Instantiates a client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name for the new bucket
    String bucketName = args[0];  // "my-new-bucket";

    // Creates the new bucket
    Bucket bucket = storage.create(BucketInfo.of(bucketName));

    System.out.printf("Bucket %s created.%n", bucket.getName());
  }
}

Node.js

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Your Google Cloud Platform project ID
const projectId = 'YOUR_PROJECT_ID';

// Creates a client
const storage = new Storage({
  projectId: projectId,
});

// The name for the new bucket
const bucketName = 'my-new-bucket';

// Creates the new bucket
storage
  .createBucket(bucketName)
  .then(() => {
    console.log(`Bucket ${bucketName} created.`);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

# Includes the autoloader for libraries installed with composer
require __DIR__ . '/vendor/autoload.php';

# Imports the Google Cloud client library
use Google\Cloud\Storage\StorageClient;

# Your Google Cloud Platform project ID
$projectId = 'YOUR_PROJECT_ID';

# Instantiates a client
$storage = new StorageClient([
    'projectId' => $projectId
]);

# The name for the new bucket
$bucketName = 'my-new-bucket';

# Creates the new bucket
$bucket = $storage->createBucket($bucketName);

echo 'Bucket ' . $bucket->name() . ' created.';

Python

# Imports the Google Cloud client library
from google.cloud import storage

# Instantiates a client
storage_client = storage.Client()

# The name for the new bucket
bucket_name = 'my-new-bucket'

# Creates the new bucket
bucket = storage_client.create_bucket(bucket_name)

print('Bucket {} created.'.format(bucket.name))

Ruby

# Imports the Google Cloud client library
require "google/cloud/storage"

# Your Google Cloud Platform project ID
project_id = "YOUR_PROJECT_ID"

# Instantiates a client
storage = Google::Cloud::Storage.new project: project_id

# The name for the new bucket
bucket_name = "my-new-bucket"

# Creates the new bucket
bucket = storage.create_bucket bucket_name

puts "Bucket #{bucket.name} was created."

API の認証

OAuth 2.0 を使って Cloud Storage の XML APIJSON API に対するリクエストを行う場合は、認証が必要なすべてのリクエストの Authorization ヘッダーにアプリケーションのアクセス トークンを指定します。

Authorization: Bearer <oauth2_token>

以下に、バケット内のオブジェクトを一覧表示するリクエストの例を示します。

JSON API

Objects リソースの list メソッドを使用します。

GET /storage/v1/b/example-bucket/o HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

XML API

List objects リクエストを使用します。

GET / HTTP/1.1
Host: example-bucket.storage.googleapis.com
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

アクセス トークンを管理したり更新したりするのは複雑であり、暗号化アプリケーションを直接扱うにはリスクがあるため、検証済みのクライアント ライブラリを使用することを強くおすすめします。

Amazon S3 との相互運用可能なアクセスのために XML API で使用するためのデベロッパー キーを探している場合は、単純な移行でのデベロッパー キーの管理をご覧ください。

ユーザー アカウント認証情報

認証のためのユーザー アカウント認証情報は、アプリケーションがユーザーの代わりにデータにアクセスする必要がある場合に使用します。それ以外の場合はサービス アカウント認証情報を使用します。以下は、ユーザー アカウント認証情報を使用できるシナリオの例です。

  • ウェブサーバー アプリケーション
  • インストールされたアプリケーションとデスクトップ アプリケーション
  • モバイルアプリ
  • クライアント側の JavaScript
  • 入力が限られた端末上のアプリケーション

これらのシナリオの詳細については、OAuth のシナリオをご覧ください。

エンドユーザー向けに複数の認証オプションをサポートするアプリケーションを設計している場合は、Firebase 認証を使用します。メールとパスワードによる認証に加えて、Google、Facebook、Twitter、GitHub などの ID プロバイダを使用した連携ログインがサポートされています。

ユーザー中心の認証フローで、エンドユーザーによりアクセス トークンが許可されている場合、そのアクセス トークンは、トークンを許可するユーザーが使用できる権限のみを持ちます。たとえば、jane@gmail.com が example-bucket への read-only アクセス権を持っている場合、Jane が read-write アクセスを許可したアプリケーションは、本人の代わりに example-bucket に対して書き込みを行うことはできません。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

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

Cloud Storage ドキュメント