2

我們正在使用GAE Cloud Storage API來創建和訪問文件。我們使用gsutil將我們的gae應用程序服務帳戶添加到存儲區的默認ACL。GAE應用程序可以在沒有OAuth跳舞的情況下訪問雲存儲RESTful API嗎?

下一步是做一些事情,如列出桶內容。爲此,使用OAuth訪問的RESTful API似乎是一種可行的選擇。但是,要從任務隊列訪問雲存儲,我們希望避免OAuth舞蹈中的「用戶同意」步驟。 API控制檯允許爲此目的添加服務帳戶的客戶端ID,但我們找不到任何文檔或使用服務帳戶訪問API的示例。

到目前爲止,我們已經看了Au-to-do應用程序(需要OAuth舞蹈)和google-api-python-client樣本。這些顯示都不能訪問默認的服務帳戶。

是否有任何使用應用引擎服務帳戶授權請求雲存儲RESTful API的示例?

+0

當App Engine已經有一個內置API用於直接訪問雲存儲時,爲什麼要使用restful API? – 2012-03-22 12:15:35

+0

內置API不會讓我列出存儲桶的內容。 – Yasser 2012-03-22 13:40:01

回答

2

您可以使用可互操作訪問訪問Google雲端存儲,並使用訪問密鑰和密鑰訪問您的存儲桶。
過程是described in great details,你可以看到實現的過程中boto包示例代碼(尋找HmacAuthV1Handler在auth.py

1

使用REST API而不做OAuth技巧是使用GAE的最簡單方法App Identity獲取訪問令牌,然後使用訪問令牌訪問Google雲端存儲。無論哪種情況,您都需要將App Identity的電子郵件表單添加到您的Google雲端存儲項目中,如Files API for Google Cloud Storage文檔的先決條件部分所述(即使您未使用該文檔,也需要執行此操作Files API,因爲這會設置您的項目,以便App Engine應用程序可以訪問它)。

4

我正在發佈一個小樣本,其中詳細說明了您在問什麼:如何使用App Engine服務帳戶憑據訪問Google雲端存儲(特別是列出格式化的Google雲端存儲存儲區) 。如果可用,這將是https://code.google.com/p/google-api-python-client/回購的一部分,但在此之前,這裏是代碼:

import httplib2 
import logging 
import os 
import pickle 
import re 

from google.appengine.api import memcache 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp.util import run_wsgi_app 
from oauth2client.appengine import AppAssertionCredentials 

# Constants for the XSL stylesheet and the Google Cloud Storage URI. 
XSL = '\n<?xml-stylesheet href="/listing.xsl" type="text/xsl"?>\n'; 
URI = 'http://commondatastorage.googleapis.com' 

# Obtain service account credentials and authorize HTTP connection. 
credentials = AppAssertionCredentials(
    scope='https://www.googleapis.com/auth/devstorage.read_write') 
http = credentials.authorize(httplib2.Http(memcache)) 

class MainHandler(webapp.RequestHandler): 

    def get(self): 
    try: 
     # Derive desired bucket name from path after domain name. 
     bucket = self.request.path 
     if bucket[-1] == '/': 
     # Trim final slash, if necessary. 
     bucket = bucket[:-1] 
     # Send HTTP request to Google Cloud Storage to obtain bucket listing. 
     resp, content = http.request(URI + bucket, "GET") 
     if resp.status != 200: 
     # If error getting bucket listing, raise exception. 
     err = 'Error: ' + str(resp.status) + ', bucket: ' + bucket + \ 
       ', response: ' + str(content) 
     raise Exception(err) 
     # Edit returned bucket listing XML to insert style sheet for nice 
     # formatting and send results to client. 
     content = re.sub('(<ListBucketResult)', XSL + '\\1', content) 
     self.response.headers['Content-Type'] = 'text/xml' 
     self.response.out.write(content) 
    except Exception as e: 
     self.response.set_status(404) 
     self.response.out.write(str(e)) 

def main(): 
    application = webapp.WSGIApplication(
     [ 
     ('.*', MainHandler), 
     ], 
     debug=True) 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 

此代碼取決於XSLT樣式表。您可以註釋掉引用XSL來消除依賴或包括在您的項目中的以下文件(名稱listing.xsl):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ama="http://doc.s3.amazonaws.com/2006-03-01"> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2><a href="http://developer.google.com/storage">Google Cloud Storage</a> Con 
tent Listing for Bucket 
     <xsl:value-of select="ama:ListBucketResult/ama:Name"/></h2> 
    <table border="1" cellpadding="5"> 
     <tr bgcolor="#9acd32"> 
     <th>Object Name</th> 
     <th>Modification Time</th> 
     <th>ETag</th> 
     <th>Size</th> 
     <th>Storage Class</th> 
     </tr> 
     <xsl:for-each select="ama:ListBucketResult/ama:Contents"> 
     <tr> 
     <td><xsl:value-of select="ama:Key"/></td> 
     <td><xsl:value-of select="ama:LastModified"/></td> 
     <td><xsl:value-of select="ama:ETag"/></td> 
     <td><xsl:value-of select="ama:Size"/></td> 
     <td><xsl:value-of select="ama:StorageClass"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

這怎麼可以在devserver上測試? – 2012-03-22 19:24:47

1

谷歌現在提供了一個簽署的網址(查詢字符串身份驗證)模式來訪問雲存儲桶。這允許服務帳戶跳過OAuth舞蹈並使用簽名的URL訪問存儲區信息。一探究竟。

相關問題