GAE通过app.yaml,python decorators或users.get_current_user强制执行登录?

时间:2012-12-20 22:34:31

标签: google-app-engine python-2.7 oauth-2.0 google-api-python-client app.yaml

我在app.yaml配置文件中使用'login'选项获取GAE应用程序。看起来像这样:

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

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

更新(建议bossylobster:我希望用户始终登录(未签名用户无法执行任何操作),我需要知道用户是谁。实际上,我需要OAuth2凭据才能与Google API进行通信(例如,我需要使用Google个人资料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)

处理用户身份验证以满足我的需求的最佳方法是什么(请参阅更新)?

非常感谢提前

1 个答案:

答案 0 :(得分:6)

我认为你可能会混淆OAuth 2.0装饰器与其他两种方法的关系。

OAuth 2.0装饰器并非特定于您的应用,如果您想为用户获取OAuth 2.0凭据,然后使用这些凭据与Google API进行通信,则可以使用它。

另外两种方法是从App Engine设置的会话cookie中获取用户信息的简单方法。

如果你真的想要一个装饰者,你可以使用login_required,记录在这里:
https://developers.google.com/appengine/docs/python/tools/webapp/utilmodule

app.yaml中指定,检查users.get_current_userNone还是使用@login_required指定的处理程序之间没有一种最佳方法。

您想要使用的三个不同时间的粗略近似如下:

1)如果您希望用户登录,但不需要了解特定用户,请使用login: required中的app.yaml

2)如果想要了解用户,但如果用户未登录也有后备,请使用users.get_current_user并为用户定制行为,或者None如果返回值。

3)如果您想了解用户并且始终登录,请使用@login_required

UPDATE:

(基于对需求的进一步说明。)由于您始终希望将用户登录并始终希望获得OAuth 2.0凭据,因此您应始终使用decorator.oauth_required

至于使用API​​,只有Google Calendar API可以与google-api-python-client库一起使用。 Google Apps Provisioning APIGoogle Data API,而日历API为discovery-based API

因此,您需要使用gdata-python-client library来使用Provisioning API。您需要手动将oauth2client.client.OAuth2Credentials object转换为gdata.gauth.OAuth2Token对象,以便为任何一个使用相同的令牌。

使用OAuth2Decorator时,您将能够通过oauth2client.client.OAuth2Credentials访问decorator.credentials()的实例。

第二次更新:

我最近added支持gdata-python-client

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

无论您在哪个对象上更改值,该实现都允许两个令牌/凭据对象decorator.credentials()auth_token保持同步。