Я до сих пор не совсем уверен, какой минимальный набор разрешений я должен назначить учетной записи службы, но, по крайней мере, теперь он работает со всеми 3 разрешениями «чтения» в корзине - 2 «устаревшими» и 1 «обычными».

тим загружать файлы из Google Storage на наш сервер приложений. Важно иметь ограниченный доступ только для чтения к одной корзине и ничего больше.

Сначала я использовал обычную учетную запись пользователя (не учетную запись службы), у которой есть разрешения для доступа ко всем сегментам в нашем проекте Google Cloud, и все работало нормально - мой код Java без проблем открывал сегменты и загружал файлы.

Storage storage = StorageOptions.getDefaultInstance().getService();
Bucket b = storage.get( "mybucketname" );

Затем я захотел перейти на использование специально созданной учетной записи службы, которая имеет доступ только к одной корзине. Поэтому я создал учетную запись службы, дал разрешения на чтение одного сегмента и загрузил его файл ключей. Разрешения в Google Cloud Console называются:

Средство просмотра объектов хранения (3 члена) Доступ для чтения к объектам GCS.

Утилита командной строки gsutil отлично работает с этой учетной записью - из командной строки она позволяет получить доступ к этой корзине, но не к другим.

Инициализация из командной строки выполняется с помощью следующей команды:

gcloud --project myprojectname auth activate-service-account [email protected] --key-file=/.../keyfilename.json

Я даже попробовал две разные учетные записи служб, которые имеют доступ к разным корзинам, и из командной строки я могу переключаться между ними, а gsutil предоставляет доступ только к соответствующей корзине, а для любой другой возвращает ошибку:

«AccessDeniedException: вызывающий 403 не имеет доступа storage.objects.list к корзине xxxxxxxxxx».

Итак, из командной строки все работало нормально. Но в Java есть некоторые проблемы с аутентификацией.

Аутентификация по умолчанию, которую я ранее использовал с обычной учетной записью пользователя, перестала работать - она ​​сообщает об ошибке:

com.google.cloud.storage.StorageException: анонимные пользователи не имеют доступа storage.buckets.get к корзине xxxxxxxxxx.

Затем я попробовал следующий код (это самый простой вариант, поскольку он опирается на ключевой файл json, но я уже пробовал ряд других вариантов, найденных на разных форумах, но безуспешно):

FileInputStream fis = new FileInputStream( "/path/to/the/key-file.json" );
ServiceAccountCredentials credentials = ServiceAccountCredentials.fromStream( fis );
Storage storage = StorageOptions.newBuilder().setCredentials( credentials )
    .setProjectId( "myprojectid" ).build().getService();
Bucket b = storage.get( "mybucketname" );

И все, что я получаю, это эта ошибка:

com.google.cloud.storage.StorageException: у вызывающей стороны нет доступа к storage.buckets.get для mybucketname группы. Вызывается: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 запрещено

Та же ошибка возвращается независимо от того, к каким корзинам я пытаюсь получить доступ (даже к несуществующим). Что меня смущает, так это то, что одна и та же учетная запись службы, инициализированная тем же файлом ключей JSON, прекрасно работает из командной строки. Поэтому я думаю, что в Java-коде чего-то не хватает, что обеспечивает правильную аутентификацию.

Ответы на вопрос(1)

Ваш ответ на вопрос