Как использовать идентификатор рабочей нагрузки gcp в приложении java springboot?

Ниже я установил переменную в 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= путь к классам: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

1 ответ

Насколько я понимаю, при использовании DefaultService он будет смотреть на переменные вашей среды. Установка его в application.properties не изменит ваши переменные среды.

Вместо этого вам нужно будет указать на свой файл. Добавив его в свой application.properties, он не будет подхвачен.

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

Или, согласно официальной документации, вы можете использовать Spring Cloud GCC 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 автоматически настраивает CredentialsProvider. Он использует свойство spring.cloud.gcp.credentials.location для поиска закрытого ключа OAuth2 учетной записи службы Google. Имейте в виду, что это свойство является ресурсом Spring, поэтому файл учетных данных может быть получен из ряда различных мест, таких как файловая система, путь к классам, URL-адрес и т. Д. В следующем примере указывается свойство местоположения учетных данных в файловой системе.

spring.cloud.gcp.credentials.location = файл: /usr/local/key.json

Кроме того, вы можете установить учетные данные, напрямую указав свойство spring.cloud.gcp.credentials.encoded-key. Значение должно быть закрытым ключом учетной записи в кодировке base64 в формате JSON.

Если эти учетные данные не указаны в свойствах, стартер пытается найти учетные данные из нескольких мест:

       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 используются учетные данные учетной записи службы Flexible, а в Google Compute Engine используется учетная запись службы Compute Engine по умолчанию.

Другие вопросы по тегам