GAE强求app.yaml中,蟒蛇装饰或users.get_current_user登录?(GAE

2019-07-17 11:47发布

我用了一个GAE应用程序的app.yaml我的配置文件“登录”选项。 是这样的:

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

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

UPDATE(通过的建议bossylobster ):我想总是签署了用户(未签名的用户不能做任何事情),我需要知道用户是谁。 其实,我需要的OAuth2凭证与谷歌的API进行通信(例如,我需要获取一些用户与谷歌的配置文件API信息,并在用户与谷歌日历API日历写)。 最后,我需要一个管理员用户执行某些操作(如创建新域名的用户,与谷歌配置API)

我使用谷歌的API客户端库,并与装饰的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)的最佳方法是什么?

提前谢谢了

Answer 1:

我想你可能会混淆的OAuth 2.0装饰做什么与其他两种方法。

OAuth 2.0已装饰不特定于您的应用程序,如果你想获得的OAuth 2.0凭据的用户,然后使用这些与谷歌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: requiredapp.yaml

2)如果想知道的,但也有一个后备,如果用户没有登录,使用users.get_current_user和调整你的行为给用户或None如果是这样的返回值。

3)如果你想知道用户总是有一个登录,使用@login_required

更新:

(对需求的进一步解释为主。)因为你总是希望你的登录用户总要的OAuth对于他们2.0凭证,你应该总是使用decorator.oauth_required

作为使用的API,只有谷歌日历API可以与使用google-api-python-client库。 在谷歌企业应用套件配置API是谷歌数据API ,而日历API是基于发现的API 。

其结果是,你需要使用gdata-python-client 库使用配置API。 你需要手动从转换oauth2client.client.OAuth2Credentials对象为gdata.gauth.OAuth2Token对象使用同样的任何一个。

当使用OAuth2Decorator ,你就可以访问的实例oauth2client.client.OAuth2Credentials通过decorator.credentials()

第二次更新:

我最近加入支持这gdata-python-client

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

实现允许两个令牌/凭证对象decorator.credentials()auth_token保持同步,无论哪个对象改变值。



文章来源: GAE enforcing sign in by app.yaml, python decorators or users.get_current_user?