2

ファイルの作成とアクセスには、GAE Cloud Storage API を使用しています。gsutil を使用して、ゲー アプリ サービス アカウントをバケットのデフォルト ACL に追加しました。

次のステップでは、バケットの内容を一覧表示するなどの作業を行います。このため、OAuth アクセスを備えた RESTful API は実行可能なオプションのようです。ただし、タスクキューから Cloud Storage にアクセスするには、OAuth ダンスの「ユーザーの同意」ステップを避けたいと考えています。API コンソールでは、この目的のためにサービス アカウントのクライアント ID を追加できますが、サービス アカウントを使用して API にアクセスするドキュメントやサンプルは見つかりません。

これまで、Au-to-doアプリ (OAuth ダンスが必要) とgoogle-api-python-clientサンプルを見てきました。どちらも、デフォルトのサービス アカウントでのアクセスを示していません。

アプリ エンジン サービス アカウントを使用してクラウド ストレージ RESTful API へのリクエストを承認する例はありますか?

4

5 に答える 5

4

App Engine サービス アカウント資格情報を使用して Google Cloud Storage にアクセスする方法 (具体的には、フォーマットされた Google Cloud Storage バケットを一覧表示する方法) について、あなたが尋ねていることを正確に説明する小さなサンプルを公開中です。利用可能になると、これは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>
于 2012-03-22T09:13:06.180 に答える
2

相互運用アクセスを使用して Google Cloud Storage にアクセスできます。相互運用アクセスでは、アクセス キーとシークレット キーを使用してバケットにアクセスします。
プロセスは非常に詳細に説明されており、 botoパッケージでプロセスを実装するサンプル コードを確認できます (auth.py でHmacAuthV1Handlerを探します) 。

于 2012-03-21T21:54:46.107 に答える
1

これを見たことがあると思いますか? http://code.google.com/appengine/docs/python/googlestorage/

この API は使用していませんが、認証済みの OAuth トークンをデータストアに保存することで、App Engine の OAuth で他の API を使用しました。同様の解決策があなたにも役立つかもしれません

于 2012-03-21T20:39:26.147 に答える
1

Google は、Cloud Storage バケットにアクセスするための署名付き URL (クエリ文字列認証) モードを提供するようになりました。これにより、サービス アカウントは OAuth ダンスをスキップし、署名付き URL でバケット情報にアクセスできます。見てみな。

于 2012-03-24T12:38:40.977 に答える
1

OAuth ダンスを行わずに REST API を使用する最も簡単な方法は、GAE App Identityを使用してアクセス トークンを取得し、そのアクセス トークンを使用して Google Cloud Storage にアクセスすることです。いずれの場合も、Files API for Google Cloud Storageドキュメントの前提条件セクションで説明されているように、アプリ ID の電子メール フォームを Google Cloud Storage プロジェクトに追加する必要があります ( Files API を使用していません。これは、App Engine アプリケーションがプロジェクトにアクセスできるようにプロジェクトをセットアップするためです)。

于 2012-03-22T03:04:33.790 に答える