Cross-Origin Resource Sharing (CORS) konfigurieren

Zu den Konzepten

Cross-Origin Resource Sharing (CORS) ermöglicht Interaktionen zwischen Ressourcen aus unterschiedlichen Quellen. Normalerweise wird dies verhindert, um böswilliges Verhalten zu unterbinden. Unter diesem Thema erfahren Sie, wie Sie CORS für einen Cloud Storage-Bucket konfigurieren.

CORS für einen Bucket konfigurieren

Die CORS-Konfiguration für einen Bucket erfolgt anhand der Angabe von Informationen wie HTTP-Methoden und Quelldomains. Diese identifizieren die Arten von Anfragen, die akzeptiert werden. Sie können das gsutil-Befehlszeilentool, die XML API, die JSON API oder die Clientbibliotheken für Cloud Storage verwenden, um die CORS-Konfiguration für einen Bucket festzulegen.

Im folgenden Beispiel sehen Sie, wie Sie CORS für Ihren Bucket konfigurieren:

gsutil

  1. Erstellen Sie eine JSON-Datei, die Folgendes enthält:

    [
        {
          "origin": ["ORIGIN"],
          "method": ["METHOD"],
          "responseHeader": ["HEADER"],
          "maxAgeSeconds": MAX-AGE
        }
    ]

    Dabei gilt:

    • ORIGIN ist eine für Cross-Origin Resource Sharing mit diesem Bucket zugelassene Quelle. Beispiel: example.appspot.com
    • METHOD ist eine für Cross-Origin Resource Sharing mit diesem Bucket zugelassene HTTP-Methode. Beispiel: GET oder PUT
    • HEADER ist ein für Cross-Origin Resource Sharing mit diesem Bucket zugelassener Header. Beispiel: Content-Type
    • MAX-AGE ist die Angabe, wie viele Sekunden lang der Browser Anfragen senden darf, bevor die Preflight-Anfrage wiederholt werden muss. Beispiel: 3600

    Weitere Informationen finden Sie unter Elemente einer CORS-Konfiguration.

  2. Verwenden Sie den Befehl gsutil cors, um CORS in einem Bucket zu konfigurieren:

    gsutil cors set JSON_FILE_NAME.json gs://BUCKET_NAME

    Dabei gilt:

    • JSON_FILE_NAME ist der Pfad zur JSON-Datei, die Sie in Schritt 1 erstellt haben.
    • BUCKET_NAME ist der Name des Buckets. Beispiel: my-bucket

Codebeispiele

C++

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C++ API.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& origin) {
  StatusOr<gcs::BucketMetadata> original =
      client.GetBucketMetadata(bucket_name);

  if (!original) throw std::runtime_error(original.status().message());
  std::vector<gcs::CorsEntry> cors_configuration;
  cors_configuration.emplace_back(
      gcs::CorsEntry{3600, {"GET"}, {origin}, {"Content-Type"}});

  StatusOr<gcs::BucketMetadata> patched_metadata = client.PatchBucket(
      bucket_name,
      gcs::BucketMetadataPatchBuilder().SetCors(cors_configuration),
      gcs::IfMetagenerationMatch(original->metageneration()));

  if (!patched_metadata) {
    throw std::runtime_error(patched_metadata.status().message());
  }

  if (patched_metadata->cors().empty()) {
    std::cout << "Cors configuration is not set for bucket "
              << patched_metadata->name() << "\n";
    return;
  }

  std::cout << "Cors configuration successfully set for bucket "
            << patched_metadata->name() << "\nNew cors configuration: ";
  for (auto const& cors_entry : patched_metadata->cors()) {
    std::cout << "\n  " << cors_entry << "\n";
  }
}

Java

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Java API.

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Cors;
import com.google.cloud.storage.HttpMethod;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import com.google.common.collect.ImmutableList;

public class ConfigureBucketCors {
  public static void configureBucketCors(
      String projectId,
      String bucketName,
      String origin,
      String responseHeader,
      Integer maxAgeSeconds) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The origin for this CORS config to allow requests from
    // String origin = "http://example.appspot.com";

    // The response header to share across origins
    // String responseHeader = "Content-Type";

    // The maximum amount of time the browser can make requests before it must repeat preflighted
    // requests
    // Integer maxAgeSeconds = 3600;

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Bucket bucket = storage.get(bucketName);

    // See the HttpMethod documentation for other HTTP methods available:
    // https://cloud.google.com/appengine/docs/standard/java/javadoc/com/google/appengine/api/urlfetch/HTTPMethod
    HttpMethod method = HttpMethod.GET;

    Cors cors =
        Cors.newBuilder()
            .setOrigins(ImmutableList.of(Cors.Origin.of(origin)))
            .setMethods(ImmutableList.of(method))
            .setResponseHeaders(ImmutableList.of(responseHeader))
            .setMaxAgeSeconds(maxAgeSeconds)
            .build();

    bucket.toBuilder().setCors(ImmutableList.of(cors)).build().update();

    System.out.println(
        "Bucket "
            + bucketName
            + " was updated with a CORS config to allow GET requests from "
            + origin
            + " sharing "
            + responseHeader
            + " responses across origins");
  }
}

Node.js

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Node.js API.

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

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';
// const maxAgeSeconds = 'The maximum amount of time the browser can make requests before
// it must repeat preflighted requests, e.g. 3600';
// const method = 'name of method, e.g. [PUT,POST]';
// const origin = 'The origin for this CORS config to allow requests from, e.g. http://example.appspot.com';
// const responseHeader = 'response header to share across the origins e.g. content-type';

async function configureBucketCors() {
  await storage.bucket(bucketName).setCorsConfiguration([
    {
      maxAgeSeconds,
      method: [method],
      origin: [origin],
      responseHeader: [responseHeader],
    },
  ]);

  console.log(`Bucket ${bucketName} was updated with a CORS config
      to allow ${method} requests from ${origin} sharing
      ${responseHeader} responses across origins`);
}

configureBucketCors();

Python

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Python API.

from google.cloud import storage

def cors_configuration(bucket_name):
    """Set a bucket's CORS policies configuration."""
    # bucket_name = "your-bucket-name"

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)
    bucket.cors = [
        {
            "origin": ["*"],
            "responseHeader": [
                "Content-Type",
                "x-goog-resumable"],
            "method": ['PUT', 'POST'],
            "maxAgeSeconds": 3600
        }
    ]
    bucket.patch()

    print("Set CORS policies for bucket {} is {}".format(bucket.name, bucket.cors))
    return bucket

C#

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C# API.

Sie können CORS derzeit nicht mit der C#-Clientbibliothek konfigurieren.

Go

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Go API.

Informationen dazu, wie Sie mithilfe von Go eine CORS-Konfiguration für einen Bucket festlegen, finden Sie in der CORS-Referenzdokumentation.

PHP

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage PHP API.

Informationen dazu, wie Sie mithilfe von PHP eine CORS-Konfiguration für einen Bucket festlegen, finden Sie in der Google\Cloud\Storage\Bucket-Referenzdokumentation.

Ruby

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Ruby API.

Informationen dazu, wie Sie mithilfe von Ruby eine CORS-Konfiguration für einen Bucket festlegen, finden Sie in der Google::Cloud::Storage-Referenzdokumentation.

REST APIs

JSON API

  1. Rufen Sie ein Zugriffstoken für die Autorisierung aus dem OAuth 2.0 Playground ab. Konfigurieren Sie den Playground so, dass Ihre eigenen OAuth-Anmeldedaten verwendet werden.
  2. Erstellen Sie eine JSON-Datei, die Folgendes enthält:

    {
     "cors": [
       {
         "origin": [
           "ORIGIN"
         ],
         "method": [
           "METHOD"
         ],
         "responseHeader": [
           "HEADER"
         ],
         "maxAgeSeconds": MAX-AGE
       }
     ]
    }

    Dabei gilt:

    • ORIGIN ist eine für Cross-Origin Resource Sharing mit diesem Bucket zugelassene Quelle. Beispiel: example.appspot.com
    • METHOD ist eine für Cross-Origin Resource Sharing mit diesem Bucket zugelassene HTTP-Methode. Beispiel: GET oder PUT.
    • HEADER ist ein für Cross-Origin Resource Sharing mit diesem Bucket zugelassener Header. Beispiel: Content-Type
    • MAX-AGE ist die Angabe, wie viele Sekunden lang der Browser Anfragen senden darf, bevor die Preflight-Anfrage wiederholt werden muss. Beispiel: 3600

    Weitere Informationen finden Sie unter Elemente einer CORS-Konfiguration.

  3. Verwenden Sie cURL, um die JSON API mit einer PATCH-Bucket-Anfrage aufzurufen:

    curl --request PATCH \
     'https://storage.googleapis.com/storage/v1/b/BUCKET_NAME' \
     --header 'Authorization: Bearer OAUTH2_TOKEN' \
     --header 'Content-Type: application/json' \
     --data-binary @JSON_FILE_NAME.json

    Dabei gilt:

    • BUCKET_NAME ist der Name des Buckets. Beispiel: my-bucket
    • OAUTH2_TOKEN ist das Zugriffstoken, das Sie in Schritt 1 generiert haben.
    • JSON_FILE_NAME ist der Pfad zu der Datei, die Sie in Schritt 2 erstellt haben.

XML API

  1. Rufen Sie ein Zugriffstoken für die Autorisierung aus dem OAuth 2.0 Playground ab. Konfigurieren Sie den Playground so, dass Ihre eigenen OAuth-Anmeldedaten verwendet werden.
  2. Erstellen Sie eine XML-Datei, die Folgendes enthält:

    <?xml version="1.0" encoding="UTF-8"?>
    <CorsConfig>
     <Cors>
       <Origins>
         <Origin>ORIGIN</Origin>
       </Origins>
       <Methods>
         <Method>METHOD</Method>
       </Methods>
       <ResponseHeaders>
         <ResponseHeader>HEADER</ResponseHeader>
       </ResponseHeaders>
       <MaxAgeSec>MAX-AGE</MaxAgeSec>
     </Cors>
    </CorsConfig>
    

    Dabei gilt:

    • ORIGIN ist eine für Cross-Origin Resource Sharing mit diesem Bucket zugelassene Quelle. Beispiel: example.appspot.com
    • METHOD ist eine für Cross-Origin Resource Sharing mit diesem Bucket zugelassene HTTP-Methode. Beispiel: GET oder PUT.
    • HEADER ist ein für Cross-Origin Resource Sharing mit diesem Bucket zugelassener Header. Beispiel: Content-Type
    • MAX-AGE ist die Angabe, wie viele Sekunden lang der Browser Anfragen senden darf, bevor die Preflight-Anfrage wiederholt werden muss. Beispiel: 3600

    Weitere Informationen finden Sie unter Elemente einer CORS-Konfiguration.

  3. Verwenden Sie cURL, um die XML API mit einer Set Bucket CORS-Anfrage aufzurufen:

    curl -X PUT --data-binary @XML_FILE_NAME.xml \
    -H "Authorization: Bearer OAUTH2_TOKEN" \
    -H "x-goog-project-id: PROJECT_ID" \
    "https://storage.googleapis.com/BUCKET_NAME?cors"

    Dabei gilt:

    • BUCKET_NAME ist der Name des Buckets. Beispiel: my-bucket
    • OAUTH2_TOKEN ist das Zugriffstoken, das Sie in Schritt 1 generiert haben.
    • PROJECT_ID ist die ID des mit dem Bucket verknüpften Projekts. Beispiel: my-project
    • XML_FILE_NAME ist der Pfad zu der Datei, die Sie in Schritt 2 erstellt haben.

CORS-Konfiguration für einen Bucket ansehen

So rufen Sie die CORS-Konfiguration für einen Bucket auf:

gsutil

Verwenden Sie den Befehl gsutil cors, um die CORS-Konfiguration eines Buckets abzurufen:

gsutil cors get gs://BUCKET_NAME

Dabei ist BUCKET_NAME der Name des Buckets. Beispiel: my-bucket

Codebeispiele

Wenn Sie sich die CORS-Konfiguration für einen Bucket mithilfe der Clientbibliotheken ansehen möchten, folgen Sie der Anleitung zum Aufrufen der Metadaten eines Buckets und suchen Sie in der Antwort nach dem CORS-Feld:

C++

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C++ API.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name) {
  StatusOr<gcs::BucketMetadata> bucket_metadata =
      client.GetBucketMetadata(bucket_name);

  if (!bucket_metadata) {
    throw std::runtime_error(bucket_metadata.status().message());
  }

  std::cout << "The metadata for bucket " << bucket_metadata->name() << " is "
            << *bucket_metadata << "\n";
}

C#

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C# API.

private void GetBucketMetadata(string bucketName)
{
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName);
    Console.WriteLine($"Bucket:\t{bucket.Name}");
    Console.WriteLine($"Acl:\t{bucket.Acl}");
    Console.WriteLine($"Billing:\t{bucket.Billing}");
    Console.WriteLine($"Cors:\t{bucket.Cors}");
    Console.WriteLine($"DefaultEventBasedHold:\t{bucket.DefaultEventBasedHold}");
    Console.WriteLine($"DefaultObjectAcl:\t{bucket.DefaultObjectAcl}");
    Console.WriteLine($"Encryption:\t{bucket.Encryption}");
    if (bucket.Encryption != null)
    {
        Console.WriteLine($"KmsKeyName:\t{bucket.Encryption.DefaultKmsKeyName}");
    }
    Console.WriteLine($"Id:\t{bucket.Id}");
    Console.WriteLine($"Kind:\t{bucket.Kind}");
    Console.WriteLine($"Lifecycle:\t{bucket.Lifecycle}");
    Console.WriteLine($"Location:\t{bucket.Location}");
    Console.WriteLine($"LocationType:\t{bucket.LocationType}");
    Console.WriteLine($"Logging:\t{bucket.Logging}");
    Console.WriteLine($"Metageneration:\t{bucket.Metageneration}");
    Console.WriteLine($"Owner:\t{bucket.Owner}");
    Console.WriteLine($"ProjectNumber:\t{bucket.ProjectNumber}");
    Console.WriteLine($"RetentionPolicy:\t{bucket.RetentionPolicy}");
    Console.WriteLine($"SelfLink:\t{bucket.SelfLink}");
    Console.WriteLine($"StorageClass:\t{bucket.StorageClass}");
    Console.WriteLine($"TimeCreated:\t{bucket.TimeCreated}");
    Console.WriteLine($"Updated:\t{bucket.Updated}");
    Console.WriteLine($"Versioning:\t{bucket.Versioning}");
    Console.WriteLine($"Website:\t{bucket.Website}");
}

Go

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Go API.

import (
	"context"
	"fmt"
	"io"
	"time"

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

// getBucketMetadata gets the bucket metadata.
func getBucketMetadata(w io.Writer, bucketName string) (*storage.BucketAttrs, error) {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("storage.NewClient: %v", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()
	attrs, err := client.Bucket(bucketName).Attrs(ctx)
	if err != nil {
		return nil, fmt.Errorf("Bucket(%q).Attrs: %v", bucketName, err)
	}
	fmt.Fprintf(w, "BucketName: %v\n", attrs.Name)
	fmt.Fprintf(w, "Location: %v\n", attrs.Location)
	fmt.Fprintf(w, "LocationType: %v\n", attrs.LocationType)
	fmt.Fprintf(w, "StorageClass: %v\n", attrs.StorageClass)
	fmt.Fprintf(w, "TimeCreated: %v\n", attrs.Created)
	fmt.Fprintf(w, "Metageneration: %v\n", attrs.MetaGeneration)
	fmt.Fprintf(w, "PredefinedACL: %v\n", attrs.PredefinedACL)
	if attrs.Encryption != nil {
		fmt.Fprintf(w, "DefaultKmsKeyName: %v\n", attrs.Encryption.DefaultKMSKeyName)
	}
	if attrs.Website != nil {
		fmt.Fprintf(w, "IndexPage: %v\n", attrs.Website.MainPageSuffix)
		fmt.Fprintf(w, "NotFoundPage: %v\n", attrs.Website.NotFoundPage)
	}
	fmt.Fprintf(w, "DefaultEventBasedHold: %v\n", attrs.DefaultEventBasedHold)
	if attrs.RetentionPolicy != nil {
		fmt.Fprintf(w, "RetentionEffectiveTime: %v\n", attrs.RetentionPolicy.EffectiveTime)
		fmt.Fprintf(w, "RetentionPeriod: %v\n", attrs.RetentionPolicy.RetentionPeriod)
		fmt.Fprintf(w, "RetentionPolicyIsLocked: %v\n", attrs.RetentionPolicy.IsLocked)
	}
	fmt.Fprintf(w, "RequesterPays: %v\n", attrs.RequesterPays)
	fmt.Fprintf(w, "VersioningEnabled: %v\n", attrs.VersioningEnabled)
	if attrs.Logging != nil {
		fmt.Fprintf(w, "LogBucket: %v\n", attrs.Logging.LogBucket)
		fmt.Fprintf(w, "LogObjectPrefix: %v\n", attrs.Logging.LogObjectPrefix)
	}
	if attrs.CORS != nil {
		fmt.Fprintln(w, "CORS:")
		for _, v := range attrs.CORS {
			fmt.Fprintf(w, "\tMaxAge: %v\n", v.MaxAge)
			fmt.Fprintf(w, "\tMethods: %v\n", v.Methods)
			fmt.Fprintf(w, "\tOrigins: %v\n", v.Origins)
			fmt.Fprintf(w, "\tResponseHeaders: %v\n", v.ResponseHeaders)
		}
	}
	if attrs.Labels != nil {
		fmt.Fprintf(w, "\n\n\nLabels:")
		for key, value := range attrs.Labels {
			fmt.Fprintf(w, "\t%v = %v\n", key, value)
		}
	}
	return attrs, nil
}

Java

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Java API.

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.Map;

public class GetBucketMetadata {
  public static void getBucketMetadata(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();

    // Select all fields. Fields can be selected individually e.g. Storage.BucketField.NAME
    Bucket bucket =
        storage.get(bucketName, Storage.BucketGetOption.fields(Storage.BucketField.values()));

    // Print bucket metadata
    System.out.println("BucketName: " + bucket.getName());
    System.out.println("DefaultEventBasedHold: " + bucket.getDefaultEventBasedHold());
    System.out.println("DefaultKmsKeyName: " + bucket.getDefaultKmsKeyName());
    System.out.println("Id: " + bucket.getGeneratedId());
    System.out.println("IndexPage: " + bucket.getIndexPage());
    System.out.println("Location: " + bucket.getLocation());
    System.out.println("LocationType: " + bucket.getLocationType());
    System.out.println("Metageneration: " + bucket.getMetageneration());
    System.out.println("NotFoundPage: " + bucket.getNotFoundPage());
    System.out.println("RetentionEffectiveTime: " + bucket.getRetentionEffectiveTime());
    System.out.println("RetentionPeriod: " + bucket.getRetentionPeriod());
    System.out.println("RetentionPolicyIsLocked: " + bucket.retentionPolicyIsLocked());
    System.out.println("RequesterPays: " + bucket.requesterPays());
    System.out.println("SelfLink: " + bucket.getSelfLink());
    System.out.println("StorageClass: " + bucket.getStorageClass().name());
    System.out.println("TimeCreated: " + bucket.getCreateTime());
    System.out.println("VersioningEnabled: " + bucket.versioningEnabled());
    if (bucket.getLabels() != null) {
      System.out.println("\n\n\nLabels:");
      for (Map.Entry<String, String> label : bucket.getLabels().entrySet()) {
        System.out.println(label.getKey() + "=" + label.getValue());
      }
    }
    if (bucket.getLifecycleRules() != null) {
      System.out.println("\n\n\nLifecycle Rules:");
      for (BucketInfo.LifecycleRule rule : bucket.getLifecycleRules()) {
        System.out.println(rule);
      }
    }
  }
}

Node.js

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Node.js API.

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

// Creates a client
const storage = new Storage();

async function getBucketMetadata() {
  // Get bucket metadata.
  /**
   * TODO(developer): Uncomment the following line before running the sample.
   */
  // const bucketName = 'Name of a bucket, e.g. my-bucket';

  // Get Bucket Metadata
  const [metadata] = await storage.bucket(bucketName).getMetadata();

  for (const [key, value] of Object.entries(metadata)) {
    console.log(`${key}: ${value}`);
  }
}

PHP

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage PHP API.

use Google\Cloud\Storage\StorageClient;

/**
 * Get bucket metadata.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 *
 * @return void
 */
function get_bucket_metadata($bucketName)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $info = $bucket->info();

    printf("Bucket Metadata: %s" . PHP_EOL, print_r($info));
}

Python

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Python API.


from google.cloud import storage

def bucket_metadata(bucket_name):
    """Prints out a bucket's metadata."""
    # bucket_name = 'your-bucket-name'

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)

    print("ID: {}".format(bucket.id))
    print("Name: {}".format(bucket.name))
    print("Storage Class: {}".format(bucket.storage_class))
    print("Location: {}".format(bucket.location))
    print("Location Type: {}".format(bucket.location_type))
    print("Cors: {}".format(bucket.cors))
    print(
        "Default Event Based Hold: {}".format(bucket.default_event_based_hold)
    )
    print("Default KMS Key Name: {}".format(bucket.default_kms_key_name))
    print("Metageneration: {}".format(bucket.metageneration))
    print(
        "Retention Effective Time: {}".format(
            bucket.retention_policy_effective_time
        )
    )
    print("Retention Period: {}".format(bucket.retention_period))
    print("Retention Policy Locked: {}".format(bucket.retention_policy_locked))
    print("Requester Pays: {}".format(bucket.requester_pays))
    print("Self Link: {}".format(bucket.self_link))
    print("Time Created: {}".format(bucket.time_created))
    print("Versioning Enabled: {}".format(bucket.versioning_enabled))
    print("Labels:")
    print(bucket.labels)

Ruby

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Ruby API.

# bucket_name = "Your Google Cloud Storage bucket name"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new
bucket  = storage.bucket bucket_name

puts "ID:                       #{bucket.id}"
puts "Name:                     #{bucket.name}"
puts "Storage Class:            #{bucket.storage_class}"
puts "Location:                 #{bucket.location}"
puts "Location Type:            #{bucket.location_type}"
puts "Cors:                     #{bucket.cors}"
puts "Default Event Based Hold: #{bucket.default_event_based_hold?}"
puts "Default KMS Key Name:     #{bucket.default_kms_key}"
puts "Logging Bucket:           #{bucket.logging_bucket}"
puts "Logging Prefix:           #{bucket.logging_prefix}"
puts "Metageneration:           #{bucket.metageneration}"
puts "Retention Effective Time: #{bucket.retention_effective_at}"
puts "Retention Period:         #{bucket.retention_period}"
puts "Retention Policy Locked:  #{bucket.retention_policy_locked?}"
puts "Requester Pays:           #{bucket.requester_pays}"
puts "Self Link:                #{bucket.api_url}"
puts "Time Created:             #{bucket.created_at}"
puts "Versioning Enabled:       #{bucket.versioning?}"
puts "Index Page:               #{bucket.website_main}"
puts "Not Found Page:           #{bucket.website_404}"
puts "Labels:"
bucket.labels.each do |key, value|
  puts " - #{key} = #{value}"
end

REST APIs

JSON API

  1. Rufen Sie ein Zugriffstoken für die Autorisierung aus dem OAuth 2.0 Playground ab. Konfigurieren Sie den Playground so, dass Ihre eigenen OAuth-Anmeldedaten verwendet werden.
  2. Verwenden Sie cURL, um die JSON API mit einer GET-Bucket-Anfrage aufzurufen:

    curl -X GET \
        -H "Authorization: Bearer OAUTH2_TOKEN" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?fields=cors"

    Dabei gilt:

    • OAUTH2_TOKEN ist der Name des Zugriffstokens, das Sie in Schritt 1 generiert haben.
    • BUCKET_NAME ist der Name des entsprechenden Buckets. Beispiel: my-bucket.

XML API

  1. Rufen Sie ein Zugriffstoken für die Autorisierung aus dem OAuth 2.0 Playground ab. Konfigurieren Sie den Playground so, dass Ihre eigenen OAuth-Anmeldedaten verwendet werden.
  2. Verwenden Sie cURL, um die XML API mit einer GET-Bucket-Anfrage aufzurufen:

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME?cors"

    Dabei gilt:

    • OAUTH2_TOKEN ist der Name des Zugriffstokens, das Sie in Schritt 1 generiert haben.
    • BUCKET_NAME ist der Name des entsprechenden Buckets. Beispiel: my-bucket

CORS aus einem Bucket entfernen

So entfernen Sie die CORS-Konfiguration aus einem Bucket:

gsutil

  1. Erstellen Sie eine JSON-Datei, die Folgendes enthält:

    []
  2. Verwenden Sie den Befehl gsutil cors, um CORS in einem Bucket zu konfigurieren:

    gsutil cors set JSON_FILE_NAME.json gs://BUCKET_NAME

    Dabei gilt:

    • JSON_FILE_NAME ist der Pfad zur JSON-Datei, die Sie in Schritt 1 erstellt haben.
    • BUCKET_NAME ist der Name des Buckets. Beispiel: my-bucket

Codebeispiele

C++

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C++ API.

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name) {
  StatusOr<gcs::BucketMetadata> original =
      client.GetBucketMetadata(bucket_name);
  if (!original) throw std::runtime_error(original.status().message());

  StatusOr<gcs::BucketMetadata> patched = client.PatchBucket(
      bucket_name, gcs::BucketMetadataPatchBuilder().ResetCors(),
      gcs::IfMetagenerationMatch(original->metageneration()));
  if (!patched) throw std::runtime_error(patched.status().message());

  std::cout << "Cors configuration successfully removed for bucket "
            << patched->name() << "\n";
}

Java

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Java API.

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Cors;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.ArrayList;
import java.util.List;

public class RemoveBucketCors {
  public static void removeBucketCors(String projectId, String bucketName) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Bucket bucket =
        storage.get(bucketName, Storage.BucketGetOption.fields(Storage.BucketField.CORS));

    // getCors() returns the List and copying over to an ArrayList so it's mutable.
    List<Cors> cors = new ArrayList<>(bucket.getCors());

    // Clear bucket CORS configuration.
    cors.clear();

    // Update bucket to remove CORS.
    bucket.toBuilder().setCors(cors).build().update();
    System.out.println("Removed CORS configuration from bucket " + bucketName);
  }
}

Node.js

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Node.js API.

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

// Creates a client
const storage = new Storage();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Name of a bucket, e.g. my-bucket';

async function removeBucketCors() {
  await storage.bucket(bucketName).setCorsConfiguration([]);

  console.log(`Removed CORS configuration from bucket ${bucketName}`);
}

removeBucketCors();

Python

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Python API.

from google.cloud import storage

def remove_cors_configuration(bucket_name):
    """Remove a bucket's CORS policies configuration."""
    # bucket_name = "your-bucket-name"

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)
    bucket.cors = []
    bucket.patch()

    print("Remove CORS policies for bucket {}.".format(bucket.name))
    return bucket

C#

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage C# API.

Sie können derzeit nicht mit CORS über die C#-Clientbibliothek arbeiten.

Go

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Go API.

In der CORS-Referenzdokumentation erfahren Sie, wie Sie mit Go CORS-Konfigurationen für einen Bucket verwenden können.

PHP

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage PHP API.

In der Google\Cloud\Storage\Bucket-Referenzdokumentation erfahren Sie, wie Sie mit PHP CORS-Konfigurationen für einen Bucket verwenden können.

Ruby

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Ruby API.

In der Google Cloud Storage-Referenzdokumentation erfahren Sie, wie Sie mit Ruby CORS-Konfigurationen für einen Bucket verwenden können.

REST APIs

JSON API

  1. Rufen Sie ein Zugriffstoken für die Autorisierung aus dem OAuth 2.0 Playground ab. Konfigurieren Sie den Playground so, dass Ihre eigenen OAuth-Anmeldedaten verwendet werden.
  2. Erstellen Sie eine JSON-Datei, die Folgendes enthält:

    {
     "cors": []
    }
  3. Verwenden Sie cURL, um die JSON API mit einer PATCH-Bucket-Anfrage aufzurufen:

    curl --request PATCH \
    'https://storage.googleapis.com/storage/v1/b/BUCKET_NAME' \
    --header 'Authorization: Bearer OAUTH2_TOKEN' \
    --header 'Content-Type: application/json' \
    --data-binary @JSON_FILE_NAME.json

    Dabei gilt:

    • BUCKET_NAME ist der Name des Buckets. Beispiel: my-bucket
    • OAUTH2_TOKEN ist das Zugriffstoken, das Sie in Schritt 1 generiert haben.
    • JSON_FILE_NAME ist der Pfad zu der Datei, die Sie in Schritt 2 erstellt haben.

XML API

  1. Rufen Sie ein Zugriffstoken für die Autorisierung aus dem OAuth 2.0 Playground ab. Konfigurieren Sie den Playground so, dass Ihre eigenen OAuth-Anmeldedaten verwendet werden.
  2. Erstellen Sie eine XML-Datei, die Folgendes enthält:

    <CorsConfig></CorsConfig>
  3. Verwenden Sie cURL, um die XML API mit einer Set Bucket CORS-Anfrage aufzurufen:

    curl -X PUT --data-binary @XML_FILE_NAME.xml \
    -H "Authorization: Bearer OAUTH2_TOKEN" \
    -H "x-goog-project-id: PROJECT_ID" \
    "https://storage.googleapis.com/BUCKET_NAME?cors"

    Dabei gilt:

    • BUCKET_NAME ist der Name des Buckets. Beispiel: my-bucket
    • OAUTH2_TOKEN ist das Zugriffstoken, das Sie in Schritt 1 generiert haben.
    • PROJECT_ID ist die ID des mit dem Bucket verknüpften Projekts. Beispiel: my-project
    • XML_FILE_NAME ist der Pfad zu der Datei, die Sie in Schritt 2 erstellt haben.

Fehler bei CORS-Anfragen beheben

Wenn beim Zugriff auf Cloud Storage-Buckets von einer anderen Quelle aus ein unerwartetes Verhalten auftritt, führen Sie die folgenden Schritte aus:

  1. Verwenden Sie gsutil cors get im Ziel-Bucket, um die zugehörige CORS-Konfiguration abzurufen. Wenn Sie mehrere CORS-Konfigurationseinträge haben, achten Sie bei den folgenden Schritten darauf, dass die Anfragewerte Werten im selben CORS-Konfigurationseintrag zugeordnet sind.

  2. Stellen Sie sicher, dass Sie keine Anfrage an den Endpunkt storage.cloud.google.com stellen, da dieser keine CORS-Anfragen zulässt. Weitere Informationen zu den unterstützten Endpunkten für CORS finden Sie unter CORS-Unterstützung in Cloud Storage.

  3. Prüfen Sie mit dem Tool Ihrer Wahl eine Anfrage/Antwort. In einem Chrome-Browser können Sie mit den Standardentwicklertools folgende Informationen ansehen:

    1. Klicken Sie in der Symbolleiste des Browsers auf das Chrome-Menü (Chrome-Menüsymbol.).
    2. Wählen Sie Weitere Tools > Entwicklertools aus.
    3. Klicken Sie auf den Tab Netzwerk.
    4. Senden Sie die Anfrage von Ihrer Anwendung oder Befehlszeile aus.
    5. Suchen Sie die Anfrage im Bereich mit der Netzwerkaktivität.
    6. Klicken Sie in der Spalte Name auf die Anfrage.
    7. Im Tab Header werden die Antwortheader angezeigt. Unter Antwort sehen Sie den Inhalt der Antwort.

    Wenn Sie keine Anfrage und keine Antwort sehen, ist im Browsercache wahrscheinlich noch ein früherer fehlgeschlagener Preflight-Anfrageversuch gespeichert. Wenn Sie den Browsercache löschen, sollte auch der Preflight-Cache geleert werden. Ist dies nicht der Fall, legen Sie für MaxAgeSec in Ihrer CORS-Konfiguration einen niedrigeren Wert fest. Wenn Sie keinen Wert angeben, gilt als Standardwert 1.800 (30 Minuten). Warten Sie die Dauer des vorherigen Werts für MaxAgeSec ab und wiederholen Sie die Anfrage. Dadurch wird eine neue Preflight-Anfrage ausgeführt. Diese ruft die neue CORS-Konfiguration ab und löscht die Cache-Einträge. Erhöhen Sie den Wert für MaxAgeSec nach Beheben des Fehlers wieder, um den Preflight-Traffic zum Bucket zu reduzieren.

  4. Prüfen Sie, ob die Anfrage den Header Origin enthält und der Headerwert mindestens einem der Werte für Origins in der CORS-Konfiguration des Buckets entspricht. Das Schema, der Host und der Port der Werte müssen exakt übereinstimmen. Hier ein paar Beispiele für zulässige Übereinstimmungen:

    • http://origin.example.com entspricht http://origin.example.com:80, weil 80 der standardmäßige HTTP-Port ist, stimmt aber nicht mit https://origin.example.com, http://origin.example.com:8080, http://origin.example.com:5151 oder http://sub.origin.example.com überein.

    • https://example.com:443 entspricht https://example.com, aber nicht http://example.com oder http://example.com:443.

    • http://localhost:8080 entspricht nur genau http://localhost:8080, aber nicht http://localhost:5555 oder http://localhost.example.com:8080.

  5. Prüfen Sie, ob die HTTP-Methode der Anfrage (bei einer einfachen Anfrage) oder die in Access-Control-Request-Method angegebene Methode (bei einer Preflight-Anfrage) mindestens einem der Werte für Methods in der CORS-Konfiguration des Buckets entspricht.

  6. Prüfen Sie bei einer Preflight-Anfrage, ob diese einen oder mehrere Header der Form Access-Control-Request-Header enthält. Achten Sie in diesem Fall darauf, dass jeder Wert für Access-Control-Request-Header einem Wert für ResponseHeader in der CORS-Konfiguration des Buckets entspricht. Alle im Access-Control-Request-Header enthaltenen Header müssen in der CORS-Konfiguration der Preflight-Anfrage enthalten sein, damit diese ausgeführt werden kann und CORS-Header in die Antwort aufgenommen werden.

Weitere Informationen