2

Я использую API хранения Google для сохранения и получения изображений из приложения, развернутого в GAE. Я успешно извлекать изображения, но когда дело доходит до сохраняющегося я получаю ошибку 400 с этим в деталях:В каком домене Google Cloud Storage ожидаются определения ACL при вставке объекта?

400 OK 
{ 
    "code" : 400, 
    "errors" : [ { 
     "domain" : "global", 
     "message" : "Required", 
     "reason" : "required" 
    }], 
    "message" : "Required" 
} 

Основываясь на this information я думал, что я не нужен, так что я пытался без. Когда я добавил appspot URL Я общаюсь с облачным хранилищем Google от Я получил это:

400 OK 
{ 
    "code" : 400, 
    "errors" : [ { 
     "domain" : "global", 
     "message" : "Required", 
     "reason" : "required" 
    }, { 
     "domain" : "global", 
     "message" : "Could not find domain \"mydomain.appspot.com\".", 
     "reason" : "invalid" 
    } ], 
    "message" : "Required" 
} 

Я следовал следующие шаги:

  1. включен JSON API доступа к Google Cloud Service
  2. создал учетную запись службы
  3. загруженный файл p12
  4. сконфигурированные Maven не кодировать файл
  5. сконфигурированной Maven для включения службы хранения апите
  6. создал GoogleCredential с помощью учетной записи службы электронной почты в качестве учетной записи службы, добавил StorageScopes.DEVSTORAGE_FULL_CONTROL в объемы и связан с файлом закрытого ключа (p12)
  7. экземпляром объекта хранения используя вышеупомянутую верительных, HTTP транспорта и т.д.

Я использую список объектов, которые получают ObjectAccessControl установить на объекте StorageObject, как например:

... 
//email from the service account client id configuration in the google cloud console 
myAclList.add(new ObjectAccessControl() 
      .setEntity("user-" + settings.getEmail()).setRole("OWNER")); 
//confused about what domain I should use; tried none, 
myAclList.add(new ObjectAccessControl() 
      .setEntity("domain-" + settings.getDomain()) 
      .setRole("READER")); 
StorageObject objectMetadata = new StorageObject() 
      .setName("blahblah") 
      .setAcl(myAclList) 
      .setContentDisposition("attachment"); 
Storage.Objects.Insert insertObject = storage.objects() 
      .insert(settings.getBucket(), objectMetadata, mediaContent); 
insertObject.execute(); //400 error happens here 
... 

что именно Shoul d Я отправляю для домена? Может быть, мне не хватает конфигурации на консоли? У меня нет идей.

Благодарим вас за предложения!

EDIT: Я использую версию v1beta2-rev2-1.15.0-rc в банке google-api-services-storage.

+0

По умолчанию список ACL должен быть настроен на разумное значение по умолчанию. Если вы попытаетесь полностью отказаться от setAcl(), что-то для вас работает? –

+0

Извлечение setAcl() дает тот же результат. – edlftt

+0

Фактически [ObjectAccessControls doc] (https://developers.google.com/storage/docs/json_api/v1/defaultObjectAccessControls) ничего не говорит о настройке домена как объекта, просто группы или пользователя, пока домен должен быть установлен если доступно, но пример в документе [Object insert doc] (https://developers.google.com/storage/docs/json_api/v1/objects/insert?hl=ru) показывает, что домен, заданный как объект в ACL. – edlftt

ответ

1

Причина, по которой вы видите «Не удалось найти домен» mydomain.appspot.com \ "." что префикс «domain-» относится ко всем учетным записям в домене Google Apps для бизнеса, а не к доменным именам. Например, если вы использовали Google Apps для своей компании, fakecompany.com, и вы хотели предоставить доступ для чтения для ведра для всех учетных записей на сайте fakecompany.com, вы можете указать «domain-fakecompany.com», чтобы ссылаться на все такие Счета.

Я предполагаю, что mydomain.appspot.com является доменным именем appengine, а не доменом Google Apps для бизнеса, что может вызвать такую ​​ошибку.

Обновления: Было другое недоразумение, которое стоит указать. У учетной записи службы необязательно есть разрешение на вставку новых объектов в ведра, которые у вас есть. Убедитесь, что он либо имеет явное WRITE, либо лучшее разрешение на ведро, или, если вы используете ACL по умолчанию для ACB, это, по крайней мере, «редактор» в вашем проекте.

И наконец, убедитесь, что имена и названия вашего ведра присутствуют и не указаны при вводе объектов. Это удивительно простая проблема, и сообщение об ошибке не всегда делает это очень ясным.

+0

Ах! Это хорошо знать о домене, спасибо! – edlftt

+0

Так что все, что я пытаюсь сделать, это загрузить этот объект в GCS и сделать его доступным для чтения всем. Я хочу сделать это с помощью JSON API. Какие правила ACL следует добавлять с помощью построителя StorageObject? Я не особо забочусь о какой-либо конкретной области. Я просто хочу, чтобы владелец был настроен на электронную почту, предоставленную учетной записью службы (первые 2 строки в приведенном выше коде) и сделать ее доступной для всех, однако я, похоже, не могу даже установить ACL, у которого нет домен (см. первую ошибку JSON). Правильно ли, что домен всегда требуется? И если да, то что должно быть, если приложение находится на GAE? – edlftt

+0

ТОЛЬКО два поля, которые вы должны установить в правиле ACL, это «сущность» и «роль». Чтобы сделать объект понятным для всех, используйте «сущность» «allUsers» и роль «READER», и все. Учетная запись, которая загрузила объект, будет неявно владельцем, и попытка изменить это явно является ошибкой. –