Какой домен Google Cloud Storage ожидает в определениях ACL при вставке объекта?

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

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

Основываясь на этой информации, я подумал, что она может не понадобиться, поэтому я попытался без нее. Когда я добавил URL-адрес appspot, с которым я общаюсь в облачном хранилище 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
  2. создал сервисный аккаунт
  3. скачал файл p12
  4. настроил maven чтобы не кодировать файл
  5. настроил maven для включения API хранилища
  6. создал GoogleCredential, используя адрес электронной почты учетной записи службы в качестве учетной записи службы, добавил StorageScopes.DEVSTORAGE_FULL_CONTROL в области и связался с файлом секретного ключа (p12)
  7. создание экземпляра объекта Storage с использованием указанных выше учетных данных, 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
...

Что именно я должен отправлять для домена? Возможно, мне не хватает настроек в консоли? У меня нет идей.

Большое спасибо за любые предложения!

РЕДАКТИРОВАТЬ: я использую версию jar v1beta2-rev2-1.15.0-rc google-api-services-storage-jar.

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам