2014-02-08 105 views
4

我試圖獲得Google Cloud Storage + Google App Engine(Python)「Hello world」應用程序正在運行。GAE Python + Google雲存儲授權問題

我已按照說明激活Google Cloud Storage,並在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中列出的ID與存儲區權限中的相同,具有所有者權限。

我可以看到Google可能在其Status Codes documentation中返回403的原因,但App Engine中的調用urlfetch庫並不返回這些錯誤名稱,據我所知(我認爲它們是在錯誤代碼之後立即返回HTTP響應中的文本字符串,但是庫僅給出整數結果,我認爲)。所以我不知道下一步該做什麼。

是否有任何直截了當的方法來捕獲API返回的錯誤?如果我知道錯誤是AccountProblem與InvalidSecurity或其他什麼,我的故障排除會有很大的不同。令人非常沮喪的是,API返回錯誤代碼的方式對於使用支持的雲開發平臺上推薦的庫的用戶是無法訪問的。

如果我給「所有經過身份驗證的用戶」寫入權限,它將起作用。因此,看起來我是以某人的身份進行身份驗證,但是某人不在權限列表中。添加我登錄的Gmail帳戶,同時測試應用程序並沒有幫助。 (該應用程序需要管理員登錄才能點擊所有網址。)

+0

我想你已經通過oauth授權了應用程序? –

+1

我沒有; AppEngine文檔聲稱,他們自動傳送用於識別應用程序的憑據作爲授權,但它們顯然不完整; @ jterrace的答案爲我工作。謝謝。 –

回答

4

您需要將appengine服務帳戶添加爲具有寫入權限。

您可以在「服務帳戶名稱」下的appengine控制檯的「應用程序設置」下找到服務帳戶電子郵件。

+0

非常感謝!你能告訴我,這是否被記錄在我忽視的任何直截了當的地方,還是我的沮喪是一個正義的?我當然無法在雲存儲客戶端API文檔或鏈接頁面的任何地方找到它。 –

+0

我剛剛發現這個問題,我不得不做同樣的事情,將服務帳戶添加到Google Bucket權限。默認存儲桶不是使用App Engine的所有正確權限創建的。 – user1961