Какой домен 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"
}
Я выполнил следующие шаги:
- включил доступ JSON API к облачной службе Google
- создал сервисный аккаунт
- скачал файл p12
- настроил maven чтобы не кодировать файл
- настроил maven для включения API хранилища
- создал GoogleCredential, используя адрес электронной почты учетной записи службы в качестве учетной записи службы, добавил StorageScopes.DEVSTORAGE_FULL_CONTROL в области и связался с файлом секретного ключа (p12)
- создание экземпляра объекта 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 при вставке объектов. Это удивительно простая проблема, и предоставленное сообщение об ошибке не всегда дает четкое представление об этом.