com.google.cloud.storage.StorageException:401未经授权

时间:2017-01-26 18:24:51

标签: java google-cloud-storage

我试图让this样本工作没有成功

我安装并初始化了客户端:

export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"

echo "deb https://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update \
    && sudo apt-get -y install google-cloud-sdk \
    && sudo apt-get -y install google-cloud-sdk-app-engine-java \
    && sudo apt-get -y install google-cloud-sdk-app-engine-python \

gcloud init

然后我成功验证了:

gcloud auth activate-service-account 13672300789-compute@developer.gserviceaccount.com --key-file=DockerStorage-e7def0adcafb.json

然后我尝试了快速启动示例:

Storage storage = StorageOptions.getDefaultInstance().getService();
String bucketName = "my-first-bucket";  // "my-new-bucket";
Bucket bucket = storage.create(BucketInfo.of(bucketName));
System.out.printf("Bucket %s created.%n", bucket.getName());

未经授权的BOOM

Exception in thread "main" com.google.cloud.storage.StorageException: 401 Unauthorized

我错过了什么?

2 个答案:

答案 0 :(得分:1)

嗯...好问题。从理论上说这应该有效如果你没有另外指定auth,那么该库将首先尝试使用GOOGLE_APPLICATION_CREDENTIALS环境变量指定的凭证文件,如果没有设置,{{3} }。

我猜测由于某种原因它无法找到您的gcloud凭据。默认情况下,他们会在" .config / gcloud"您的主目录下的目录,但可以覆盖。也许检查一下那里是否有一些文件?

值得一试的是将服务帐户的JSON文件复制到该计算机并使用GOOGLE_APPLICATION_CREDENTIALS环境变量指定其路径。这不应该是必要的,但如果那也失败了,那就更有趣了。

答案 1 :(得分:1)

首先,您必须生成服务帐户凭据。

生成服务帐户凭据 要生成JSON或PKCS12格式的私钥:

  1. 在Google Cloud Platform Console中打开凭据列表。 Google Cloud Platform Console
  2. 点击创建凭据。
  3. 选择服务帐户密钥。
  4. 将打开“创建服务帐户密钥”窗口。
  5. 点击服务帐户下方的下拉框,然后点击新服务帐户。
  6. 在名称中输入服务帐户的名称。
  7. 使用默认服务帐户ID或生成其他帐户ID。
  8. 选择密钥类型:JSON或P12。
  9. 点击“创建”。
  10. 然后只需在代码中使用凭证json文件。

        StorageOptions storageOptions = StorageOptions.newBuilder()
           .setProjectId("YOUR_PROJECT_ID")
            .setCredentials(GoogleCredentials.fromStream(new 
             FileInputStream("path/YOUR_SERVICE_ACCOUNT_CRENDENTIAL.json"))).build();
        Storage storage = storageOptions.getService();