Когда я пишу объект в GCS через JSON API, а затем пытаюсь вызвать getServingUrl(), я получаю ошибку ACCESS_DENIED. Приложение App Engine может читать/записывать объект GCS без проблем, но когда он вызывает getServingUrl(), он не будет работать, если я не предоставил OWNER всем пользователям. Если я даже предоставляю READER всем пользователям, он все равно генерирует ACCESS_DENIED.Какие ACL необходимы для объекта GCS для работы getServingUrl?
Я предполагаю, что getServingUrl() должен читать метаданные, поэтому для объекта требуется OWNER. Итак, вопрос в том, какой объект я предоставляю OWNER для работы getServingUrl()?
Вот соответствующий код:
StorageObject metadata = new StorageObject()
.setMetadata(ImmutableMap.of(ExtendedMetaDataOriginalFile, originalFilename))
.setContentType(contentType);
this.storage.objects().copy(bucketName, objectName + ".chunk0", bucketName, objectName, metadata).execute();
// without this line the getServingURL generates an ACCESS_DENIED
this.storage.objectAccessControls().insert(bucketName, objectName,
new ObjectAccessControl().setEntity("allUsers").setRole("OWNER")
).execute();
ServingUrlOptions options = ServingUrlOptions.Builder.withGoogleStorageFileName("/gs/"+bucketName+"/"+objectName).secureUrl(true);
String imageServingURL = ImagesServiceFactory.getImagesService().getServingUrl(options); // throws an exception with ACCESS_DENIED unless i set allUsers to OWNER
Я теперь пытался каждый объект я могу думать - только ALLUSERS и allAuthenticatedUsers работы. Однако я могу предоставить OWNER всем аутентифицированным пользователям, получить обслуживающий URL-адрес, а затем отозвать это разрешение. Он все еще работает ... так что разрешения необходимы для создания обслуживающего URL-адреса, но не обслуживают его (по крайней мере, до сих пор в моем тестировании). –