Может ли приложение GAE получить доступ к API Cloud Storage RESTful без танца OAuth? - PullRequest
2 голосов
/ 21 марта 2012

Мы используем API-интерфейс GAE Cloud Storage для создания и доступа к файлам. Мы использовали gsutil для добавления нашей учетной записи службы приложений gae в ACL по умолчанию для корзины.

Следующим шагом является создание списка содержимого корзины. Для этого RESTful API с доступом OAuth представляется жизнеспособным вариантом. Однако, чтобы получить доступ к облачному хранилищу из очереди задач, мы хотим избежать шага «согласия пользователя» в танце OAuth. Консоль API позволяет добавлять идентификатор клиента для учетной записи службы для этой цели, но мы не можем найти какую-либо документацию или примеры использования учетной записи службы для доступа к API.

Итак, мы рассмотрели приложение Au-to-do (требуется OAuth Dance) и образцы google-api-python-client . Ни один из них не показывает доступ с учетной записью службы по умолчанию.

Существуют ли примеры использования учетной записи службы механизма приложений для авторизации запросов к облачному хранилищу RESTful API?

Ответы [ 5 ]

4 голосов
/ 22 марта 2012

Я нахожусь в процессе публикации небольшого примера, который точно иллюстрирует, о чем вы спрашиваете: как использовать учетные данные учетной записи службы 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, чтобы устранить эту зависимость, или включить в свой проект следующий файл (с именем перечисление. 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>
2 голосов
/ 22 марта 2012

Вы можете получить доступ к Google Cloud Storage с помощью интероперабельного доступа, с интероперабельным доступом вы используете ключ доступа и секретный ключ для доступа к вашим корзинам.
Процесс подробно описан , и вы можетесм. пример кода, который реализует процесс в пакете boto (ищите HmacAuthV1Handler в auth.py )

1 голос
/ 24 марта 2012

Google теперь предлагает режим подписанных URL (Query String Authentication) для доступа к корзинам облачного хранилища. Это позволяет учетным записям служб пропускать танец OAuth и получать доступ к информации о корзине с подписанным URL-адресом. Проверьте это.

1 голос
/ 22 марта 2012

Самый простой способ использовать REST API без выполнения танца OAuth - это использовать GAE App Identity для получения токена доступа, а затем использовать токен доступа для доступа к Google Cloud Storage.В любом случае вам нужно будет добавить форму электронной почты идентификатора приложения в проект облачного хранилища Google, как описано в разделе предварительных требований документации Файловый API для облачного хранилища Google (вам потребуетсясделать это, даже если вы не используете API-интерфейс Files, поскольку это настраивает ваш проект так, чтобы приложение App Engine могло к нему обращаться).

1 голос
/ 22 марта 2012

Я полагаю, вы видели это?http://code.google.com/appengine/docs/python/googlestorage/

Я не использовал этот API, но использовал другие API с OAuth на App Engine, храня аутентифицированный токен OAuth в хранилище данных.Подобное решение может работать и для вас

...