3

GAEアプリケーションのapp.yaml構成ファイルで「login」オプションを使用しています。このように見えます:

- url: /admin/.*
  script: myapp.app
  login: admin

- url: /.*
  script: myapp.app
  login: required

更新(bossylobsterの提案による):ユーザーが常にサインインしていること(署名されていないユーザーは何もできない)が必要であり、ユーザーが誰であるかを知る必要があります。実際、Google APIと通信するにはOAuth2資格情報が必要です(たとえば、Google Profiles APIを使用してユーザーの情報を取得し、Google Calendar APIを使用してユーザーのカレンダーに書き込む必要があります)。最後に、いくつかの操作を実行するための管理者ユーザーが必要です(Google Provisioning APIを使用して新しいドメインのユーザーを作成するなど)

私はgoogle-api-clientライブラリを使用しており、oauth2デコレータで遊んでいます。次に、RequestHandlersに次のように表示されます。

class MainHandler(webapp.RequestHandler):

  @decorator.oauth_aware
  def get(self):
    if decorator.has_credentials():
      # do something

    else:
      url = decorator.authorize_url()
      self.response.out.write(template.render('templates/index.html',
           {'authorize_url': url}))

最後に、私は別の方法について読みました:

user = users.get_current_user()
if user:
  # do something
else:
  greeting = ("<a href=\"%s\">Sign in or register</a>." %
    users.create_login_url("/"))

  self.response.out.write("<html><body>%s</body></html>" % greeting)

私のニーズに合うようにユーザーの認証を処理するための最良の方法は何ですか(UPDATEを参照)?

よろしくお願いします

4

1 に答える 1

6

OAuth2.0デコレータが他の2つのアプローチと何をするのか混乱しているかもしれません。

OAuth 2.0デコレータはアプリに固有のものではありません。ユーザーのOAuth2.0クレデンシャルを取得し、それらを使用してGoogleAPIと通信する場合に使用します。

他の2つは、AppEngineによって設定されたセッションCookieからユーザー情報を取得するための単純な方法です。

デコレータが本当に必要な場合は、 httpslogin_required://developers.google.com/appengine/docs/python/tools/webapp/utilmoduleに記載されているを使用します。

で指定するか、であるapp.yamlかどうかを確認するか、指定されたハンドラーで使用するかを指定するのに最適なアプローチはありません。users.get_current_userNone@login_required

これらを使用したい3つの異なる時間の大まかな概算は次のとおりです。

1)ユーザーをログインさせたいが、特定のユーザーを知る必要がない場合は、で使用login: requiredapp.yamlます。

2)ユーザーを知りたいが、ユーザーがログインしていない場合のフォールバックもある場合は、ユーザーまたはそれが戻り値であるかどうusers.get_current_userかに合わせて動作を使用および調整します。None

3)ユーザーを知りたい場合で、常にユーザーをログインさせたい場合は、を使用します@login_required

アップデート:

(ニーズの詳細な説明に基づいています。)ユーザーは常にログインし、ユーザーのOAuth 2.0クレデンシャルが必要なため、常にを使用する必要がありますdecorator.oauth_required

APIの使用に関しては、 GoogleCalendarAPIのみがライブラリで使用できますgoogle-api-python-clientGoogle AppsProvisioningAPIはGoogleDataAPIですが、CalendarAPIは検出ベースのAPIです。

そのため、ProvisioningAPIを使用するにはgdata-python-client ライブラリを使用する必要があります。どちらにも同じトークンを使用するには、オブジェクトからoauth2client.client.OAuth2Credentialsオブジェクトに手動で変換する必要があります。gdata.gauth.OAuth2Token

を使用すると、 viaOAuth2Decoratorのインスタンスにアクセスできるようになります。oauth2client.client.OAuth2Credentialsdecorator.credentials()

2回目の更新:

最近、これのサポートをに追加gdata-python-clientしました。

from gdata.gauth import OAuth2TokenFromCredentials
auth_token = OAuth2TokenFromCredentials(decorator.credentials())
auth_token.authorize(client)

この実装により、値を変更するオブジェクトに関係なく、2つのトークン/クレデンシャルオブジェクトdecorator.credentials()auth_token同期を維持できます。

于 2012-12-20T22:40:06.030 に答える