3

我在我的 app.yaml 配置文件中为 GAE 应用程序使用了“登录”选项。看起来像这样:

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

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

更新(根据bossylobster的建议):我希望用户始终登录(未签名的用户不能做任何事情),我需要知道用户是谁。实际上,我需要 OAuth2 凭据才能与 Google API 进行通信(例如,我需要使用 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)

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

提前谢谢了

4

1 回答 1

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在指定 in 、检查 if users.get_current_userisNone或 using @login_requiredon 指定的处理程序之间没有一种最佳方法。

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

1)如果您希望用户登录,但不需要知道具体用户,请使用login: requiredin app.yaml

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

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

更新:

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

至于使用 API,只有Google Calendar API可以与google-api-python-client库一起使用。Google Apps Provisioning API是一个Google Data API ,而Calendar API 是一个基于发现的 API

因此,您需要使用该gdata-python-client 来使用 Provisioning API。您需要手动从一个oauth2client.client.OAuth2Credentials对象转换为一个对象,gdata.gauth.OAuth2Token以便为任一对象使用相同的标记。

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

第二次更新:

我最近将对此的支持添加gdata-python-client到.

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

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

于 2012-12-20T22:40:06.030 回答