2014-02-08 5 views
4

Я пытаюсь запустить приложение 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-адреса.)

+0

Я полагаю, что вы разрешили приложение с oauth? –

+1

У меня не было; Документы AppEngine утверждают, что они автоматически передают учетные данные, идентифицирующие приложение как разрешенные, но, по-видимому, они неполны; Ответ @ jterrace работал для меня. Благодарю. –

ответ

4

Необходимо добавить учетную запись службы appengine как имеющую права на запись.

Адрес электронной почты службы поддержки можно найти в разделе «Параметры приложения» консоли appengine в разделе «Имя учетной записи службы».

+0

Большое спасибо! Можете ли вы сказать мне, если это задокументировано где-то прямо, что я забыл, или мое разочарование - праведный? Я, конечно, не могу найти его нигде в документации API клиентского облачного хранилища или связанных страницах. –

+0

Я только что нашел эту проблему, мне пришлось сделать то же самое, добавьте учетную запись службы в разрешения Google Bucket. Контейнер по умолчанию НЕ создается со всеми правильными разрешениями для App Engine. – user1961

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