2014-12-23 3 views
1

Когда я пишу объект в 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 
+0

Я теперь пытался каждый объект я могу думать - только ALLUSERS и allAuthenticatedUsers работы. Однако я могу предоставить OWNER всем аутентифицированным пользователям, получить обслуживающий URL-адрес, а затем отозвать это разрешение. Он все еще работает ... так что разрешения необходимы для создания обслуживающего URL-адреса, но не обслуживают его (по крайней мере, до сих пор в моем тестировании). –

ответ

1

Установка разрешений на объект, а не ведро, а именно, решает проблему с getServingUrl():

storage.objectAccessControls().insert(bucketName, objectName, 
     new ObjectAccessControl().setEntity("[email protected]") 
     .setRole("OWNER")).execute(); 
0

Это звучит как приложение App Engine не может иметь полный контроль над ведром или объекты в ведре. Попробуйте изменить ACL объекта по умолчанию на используемое ведро, которое дает вам разрешения FULL_CONTROL для вашего приложения, а также дает ваше приложение FULL_CONTROL в ACL ведра.

+0

Можете ли вы представить фрагмент того, что может выглядеть? –

+0

Ведра создаются с помощью учетной записи службы через JSON API, разрешения на ведро следующие: Владельцы проектов-463613709343 OWNER/Редакторы проектов-463613709343 OWNER/Project viewers-463613709343 READER ---- поэтому какие дополнительные разрешения необходимы для приложение для вызова getServingURL ?? –

+1

Является ли учетной записью службы, которую приложение приложения работает, как та же учетная запись службы, которая создает ведро? Другими словами, ваш[email protected] один из владельцев проекта 463613709343? –

Смежные вопросы