我在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)
处理用户身份验证以满足我的需求的最佳方法是什么(请参阅更新)?
非常感谢提前
答案 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_user
是None
还是使用@login_required
指定的处理程序之间没有一种最佳方法。
您想要使用的三个不同时间的粗略近似如下:
1)如果您希望用户登录,但不需要了解特定用户,请使用login: required
中的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,而日历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
保持同步。