0

在下面,我在 application.properties 中设置变量并尝试使用默认服务实例:

    private static void testListGCPBucket() String configPath) throws IOException {
        
         Storage storage = StorageOptions.getDefaultInstance().getService();
        System.out.println("Buckets:");
        Page<Bucket> buckets = storage.list();
        for (Bucket bucket : buckets.iterateAll()) {
            System.out.println(bucket.toString());
        }
        System.out.println("completed...");
    }

application.config文件内容:

GOOGLE_APPLICATION_CREDENTIALS =classpath:config.json

但这不起作用我收到以下错误:

Caused by: com.google.api.client.http.HttpResponseException: 403 Forbidden
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/proj-workload-id-svc-acct@idmp-mii-dev-ddb5.iam.gserviceaccount.com:generateAccessToken
{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "errors": [
      {
        "message": "The caller does not have permission",
        "domain": "global",
        "reason": "forbidden"
      }
    ],
    "status": "PERMISSION_DENIED"
  }
}

    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1116)
    at com.google.auth.oauth2.ImpersonatedCredentials.refreshAccessToken(ImpersonatedCredentials.java:441)
    ... 36 more
4

1 回答 1

1

根据我的理解,如果使用DefaultService那么它将查看您的环境变量。将其设置到您的 application.properties 不会修改您的环境变量。

您将需要指向您的文件。将其添加到您的 application.properties 中,它不会被拾取。

Credentials credentials = GoogleCredentials
  .fromStream(new FileInputStream("yourJsonConfig"));
Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

或者根据官方文档,您可以使用 Spring Cloud GCP Starter,并使用您的 application.properties 文件对其进行配置。

https://docs.spring.io/spring-cloud-gcp/docs/1.1.0.M1/reference/html/spring-cloud-gcp-core.html#_credentials

2 证书

CredentialsProvider 是一个功能接口,它返回凭据以对 Google Cloud 客户端库的调用进行身份验证和授权。

公共接口 CredentialsProvider { Credentials getCredentials() 抛出 IOException;}

Spring Cloud GCP starter 自动配置一个 CredentialsProvider。它使用 spring.cloud.gcp.credentials.location 属性来定位 Google 服务帐户的 OAuth2 私钥。请记住,此属性是一个 Spring 资源,因此可以从许多不同的位置获取凭证文件,例如文件系统、类路径、URL 等。下一个示例指定文件系统中的凭证位置属性。

spring.cloud.gcp.credentials.location=文件:/usr/local/key.json

或者,您可以通过直接指定 spring.cloud.gcp.credentials.encoded-key 属性来设置凭据。该值应该是 JSON 格式的 base64 编码的帐户私钥。

如果未通过属性指定该凭据,则启动器会尝试从多个位置发现凭据:

Credentials file pointed to by the GOOGLE_APPLICATION_CREDENTIALS environment variable
Credentials provided by the Google Cloud SDK gcloud auth application-default login command
Google App Engine built-in credentials
Google Cloud Shell built-in credentials
Google Compute Engine built-in credentials

如果您的应用在 Google App Engine 或 Google Compute Engine 上运行,在大多数情况下,您应该省略 spring.cloud.gcp.credentials.location 属性,而是让 Spring Cloud GCP Starter 获取这些环境的正确凭据。在 App Engine Standard 上,使用 App Identity 服务帐户凭据,在 App Engine Flexible 上,使用灵活服务帐户凭据,在 Google Compute Engine 上,使用 Compute Engine 默认服务帐户。

spring.cloud.gcp.credentials.location=file:/usr/local/key.json
于 2021-09-20T08:11:08.907 回答