Я пытаюсь запустить приложение Google Cloud Storage + Google App Engine (Python).Проблемы с авторизацией в хранилище Google Python + Google Cloud
Я выполнил инструкции по активации облачного хранилища Google и создал ведро из консоли приложения App Engine. Я написал тривиальную программу для записи тестового файла, но когда я его запускаю, библиотека облачных хранилищ выбрасывает 403, по-видимому, потому что мои учетные данные приложения App Engine не представлены, недействительны или не имеют права на это ведро.
Вот код:
BUCKET = '/pcj-info-testing'
class TestGCS(webapp2.RequestHandler):
def create_file(self, filename):
self.response.write("Creating\n");
gcs_file = gcs.open(filename, 'w', content_type = 'text/plain');
gcs_file.write('Testing, 1, 2, 3\n')
gcs_file.write('At ' + datetime.now().isoformat())
gcs_file.close()
def get(self):
self.response.headers['Content-Type'] = 'text/plain'
filename = BUCKET + "/demo-file" + str(random.randrange(10**10, 10**11-1))
self.create_file(filename)
self.response.write('File stat:\n')
stat = gcs.stat(filename)
self.response.write(repr(stat))
и вот соответствующая часть трассировки стека и ошибок:
File "/base/data/home/apps/s~pcj-info/1.373629132682543570/gcstest.py", line 14, in create_file
gcs_file = gcs.open(filename, 'w', content_type = 'text/plain');
File "/base/data/home/apps/s~pcj-info/1.373629132682543570/cloudstorage/cloudstorage_api.py", line 74, in open
return storage_api.StreamingBuffer(api, filename, content_type, options)
File "/base/data/home/apps/s~pcj-info/1.373629132682543570/cloudstorage/storage_api.py", line 597, in __init__
errors.check_status(status, [201], path, headers, resp_headers)
File "/base/data/home/apps/s~pcj-info/1.373629132682543570/cloudstorage/errors.py", line 106, in check_status
raise ForbiddenError(msg)
ForbiddenError: Expect status [201] from Google Storage. But got status 403.
Path: '/pcj-info-testing/demo-file16955619179'.
Request headers: {'x-goog-resumable': 'start', 'x-goog-api-version': '2', 'content-type': 'text/plain', 'accept-encoding': 'gzip, *'}.
Response headers: {'alternate-protocol': '443:quic', 'content-length': '146', 'via': 'HTTP/1.1 GWA', 'x-google-cache-control': 'remote-fetch', 'vary': 'Origin', 'server': 'HTTP Upload Server Built on Jan 23 2014 15:07:07 (1390518427)', 'date': 'Sat, 08 Feb 2014 16:49:56 GMT', 'content-type': 'application/xml; charset=UTF-8'}.
Extra info: None.
Я смотрел на привилегии доступа на ведро, и они выглядят (хотя они должны были быть созданы правильно по умолчанию, в соответствии с документацией) - идентификаторы, перечисленные как мои в Google APIs Console, являются теми же самыми в разрешениях ведра, с разрешениями Владельца.
Я вижу причины, по которым Google может вернуть 403 в свой Status Codes documentation, но библиотека urlfetch в App Engine, которая делает вызов, не возвращает эти имена ошибок, насколько я могу судить (я полагаю, они являются текстовые строки, возвращаемые в ответе HTTP сразу после кода ошибки, но библиотека дает только целочисленный результат, я думаю). Поэтому я не понимаю, что делать дальше.
Есть ли простой способ захвата ошибки, возвращаемой API? Мое устранение неполадок сильно изменилось бы, если бы я знал, что была ошибка AccountProblem против InvalidSecurity или что-то в этом роде. Очень неприятно, что API возвращает коды ошибок таким образом, который недоступен для пользователей с использованием рекомендуемой библиотеки на поддерживаемой платформе разработки облачных вычислений.
Если я предоставляю доступ к записи «Все проверенные пользователи», она работает. Таким образом, похоже, что я аутентифицируюсь как кто-то, но кто-то не входит в список разрешений. Добавив учетную запись Gmail, я вошел в систему, пока тестирование приложения не помогает. (Приложение требует входа в систему администратора, чтобы поразить все URL-адреса.)
Я полагаю, что вы разрешили приложение с oauth? –
У меня не было; Документы AppEngine утверждают, что они автоматически передают учетные данные, идентифицирующие приложение как разрешенные, но, по-видимому, они неполны; Ответ @ jterrace работал для меня. Благодарю. –