403 пытается подписать предоставленные байты: у вызывающего нет разрешения

#google-kubernetes-engine

#google-kubernetes-engine

Вопрос:

Подробная информация о файле POM:

       <dependency>
    <groupId>com.google.auth</groupId>
    <artifactId>google-auth-library-appengine</artifactId>
</dependency>
  

1.2.4.ВЫПУСК

Библиотеки, включенные в jar: Строка 643: Шаг # 0: Загрузка [ИНФОРМАЦИИ] из центра: https://repo.maven.apache.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.21.1/google-auth-library-oauth2-http-0.21.1.pom Строка 643: Шаг # 0: Загрузка [ИНФОРМАЦИИ] из центра: https://repo.maven.apache.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.21.1/google-auth-library-oauth2-http-0.21.1.pom

Сведения об окружающей среде

  • ОС: Debian
  • Версия Java: 11
  • google-auth-library-версии java: 0.21.1

Шаги для воспроизведения

  • загрузите файл в корзину GCS.
  • Попробуйте загрузить его, используя приведенный ниже код. Stacktrace
 com.google.auth.ServiceAccountSigner$SigningException: Failed to sign the provided bytes
at com.google.auth.oauth2.IamUtils.sign(IamUtils.java:87)
at com.google.auth.oauth2.ComputeEngineCredentials.sign(ComputeEngineCredentials.java:361)
at com.google.cloud.storage.StorageImpl.signUrl(StorageImpl.java:772)
at com.google.cloud.storage.Blob.signUrl(Blob.java:822)

Caused by: java.io.IOException: Error code 403 trying to sign provided bytes: The caller does not have permission
at com.google.auth.oauth2.IamUtils.getSignature(IamUtils.java:125)
at com.google.auth.oauth2.IamUtils.sign(IamUtils.java:84)
... 69 more
  

Фрагмент кода

 // [START auth_cloud_explicit_compute_engine]
public Storage authCompute() throws IOException {
// Explicitly request service account credentials from the compute engine
// instance.
//GoogleCredentials credentials = ComputeEngineCredentials.create();
GoogleCredentials credentials = ComputeEngineCredentials.getApplicationDefault();
Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

    System.out.println("Buckets:");
    Page<Bucket> buckets = storage.list();
    for (Bucket bucket : buckets.iterateAll()) {
        System.out.println(bucket.toString());
    }
    return storage;
}
// [END auth_cloud_explicit_compute_engine]
Storage storage = authUtil.authCompute();
Blob blob = storage.get(BlobId.of(bucketName, objectName));
return blob.signUrl(urlExpirationTime, TimeUnit.MILLISECONDS);
  

Мое приложение развернуто на GKE. Оттуда мы пытаемся загрузить / получить подписанный URL-адрес файла, т. е. сохраненный в GCS.

Комментарии:

1. Похоже, что это ошибка разрешений для учетной записи, которую вы используете для доступа к хранилищу. Насколько я вижу, вы используете учетную запись службы по умолчанию для GKE для доступа к корзине. Пожалуйста, проверьте, имеет ли используемая вами учетная запись службы надлежащие разрешения для доступа к корзине с помощью IAM или ACL в корзине.

2. Учетная запись службы GCP привязывается к учетной записи gke с правами администратора. Мы можем загружать файлы, но не можем загрузить их или получить подписанный URL.

Ответ №1:

ComputeEngineCredentials использует вызов API IAM sign blob, поэтому используемая учетная запись службы должна иметь разрешение iam.ServiceAccounts.signBlob. В зависимости от ваших настроек это может быть учетная запись службы по умолчанию для GKE или идентификатор рабочей нагрузки.

Комментарии:

1. Ты лучший. Почему (или где??) это неправильно задокументировано? Как вы сами узнали?

Ответ №2:

API учетных данных учетной записи службы IAM этот api также должен быть включен вместе с доступом к создателю токена учетной записи службы.