3

Python を使用して Google App Engine アプリを開発しています。そして、私は使用しています:

  • Google Calendar API v3 (自分のドメインのカレンダーにアクセスするため。つまり、これは自分のドメインにインストールされた Google Apps です)
  • Python 用の Google API クライアント ライブラリ。
  • 自分のドメイン (name@mydomain.com) のユーザーを認証するための OAuth2

次の理由から、サービス アカウントを使用する必要があると考えました。

「アプリケーションのプロジェクトが所有するデータにアクセスするために App Engine アプリケーションが API を呼び出す必要がある場合は、サービス アカウントを使用して OAuth 2.0 を簡素化できます。」

https://developers.google.com/api-client-library/python/platforms/google_app_engine#ServiceAccountsから取得

しかし、私が何かを誤解したかどうかはわかりません。私のシナリオ (自分のドメインで GAE アプリが Google Apps にアクセスしようとしている) は、サービス アカウントの候補ですか?

OAuth2 を処理する方法をいくつか試しました。

  • 前述のように、サービス アカウントを使用する
  • Python 用の Google API クライアント ライブラリによって提供される Python デコレータを使用 (OAuth2Decorator および OAuth2DecoratorFromClientSecrets)

どちらの場合も、同じエラーが発生します。

私は完全に迷っています。手がかりはありますか?

よろしくお願いします

4

1 に答える 1

10

サービスアカウントは必要ありませんが、使用すると便利な場合があります。ライブラリで報告された問題で詳しく説明されている、AppEngineのサービスアカウントにはいくつかのトリッキーな問題があります。Google APIエクスプローラーを少し試してみて、APIの使用方法を明確にするのに役立つかどうかを確認してください。

これらのカレンダーにアクセスできるアカウントでアプリケーションを承認する限り、これがGoogle App Engineにあるかどうかに関係なく、カレンダーにアクセスできます。

ここでは、を使用するのOAuth2Decoratorが最善の策です。具体的な例を挙げれば、タスクを実行するためのコードスニペットをいくつか提供できれば幸いです。

最近尋ねられた同様の質問を参照してください:Drive SDKで使用するためにappengineの任意のユーザーにログインするにはどうすればよいですか?DriveAPIの代わりにCalendarAPIを使用する場合を除いて、これはユースケースのようです。

アップデート:

他の投稿(私があなたなら閉じることを検討します)を読んだ後、デコレータの使用方法を理解するのに役立つサンプルをまとめました。

まず、クレデンシャルを使用して、アプリがユーザーにクレデンシャルを承認できるようにします。

from apiclient.discovery import build
import json
from oauth2client.appengine import OAuth2Decorator
import webapp2

decorator = OAuth2Decorator(
  client_id='your_client_id',
  client_secret='your_client_secret',
  scope='https://www.googleapis.com/auth/calendar')

service = build('calendar', 'v3')

次に、メインページでユーザーがサインインしていることを確認し、@decorator.oauth_requiredデコレータがOAuth2.0トークンをデータストアに保存します。

class MainPage(webapp2.RequestHandler):
  @decorator.oauth_required
  def get(self):
    # This will force the user to go through OAuth
    self.response.write(...)
    # show some page to them

あなたが彼らに表示するページには、おそらくあなたはそうするフォームを持っているでしょう、POSTそして/add-eventこのAddEventハンドラーはリクエストをするためにトークンを使うことができるでしょう。oauth_requiredを使用する代わりに@decorator.oauth_aware、正常な失敗を許可するために使用します。ユーザーがブラウザセッションからのAppEngineCookieによってリクエストで検出された場合(POSTフォームからの場合)、アプリは認証されたカレンダーリクエストを行う前にデータストアからOAuth2.0クレデンシャルを検索します。

class AddEvent(webapp2.RequestHandler):
  @decorator.oauth_aware
  def post(self):
    if decorator.has_credentials():          
      event_name = self.request.get('event-name')
      some_event = {...}  # Create event here
      # Documented at
      # https://developers.google.com/google-apps/calendar/v3/reference/events/insert

      http = decorator.http()
      # Using 'primary' will insert the event for the current user
      request = service.events().insert(calendarId='primary', body=some_event)
      inserted = request.execute(http=http)
      self.response.write(json.dumps(inserted))
    else:
      self.response.write(json.dumps({'error': 'No credentials'})

最後に、これらすべてのルートが機能することを確認するには、各ハンドラーとデコレーターが使用するOAuth2.0ハンドラーのルートを定義する必要があります。

app = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/add-event', AddEvent),
    (decorator.callback_path, decorator.callback_handler())
    ],
    debug=True)

追加の参照:

https://developers.google.com/api-client-library/python/platforms/google_app_engine

https://developers.google.com/google-apps/calendar/v3/reference/events/insert

于 2012-12-11T02:57:20.013 に答える