我对oauth_aware
和oauth_required
之间区别的理解是,aware
并未强制授权,而required
则强制授权,但这不是我在实践中看到了什么。我在下面有两个webapp RequestHandlers,其中一个get()
方法用decorator.oauth_aware
修饰,另一个用decorator.oauth_required
修饰。但是,当我在本地或App Engine上运行时,都会立即重定向到登录流程。
目标是让SplashHandler
为用户提供一个授权链接,如果他们不是,如果他们是,则转发到/tasks/
。
decorator = OAuth2Decorator(
client_id=settings.CLIENT_ID,
client_secret=settings.CLIENT_SECRET,
scope=settings.SCOPE,
user_agent='mytasks')
class SplashHandler(webapp.RequestHandler):
@decorator.oauth_aware
def get(self):
if not decorator.has_credentials():
self.response.out.write(template.render('templates/convert.html',
{'authorize_url': decorator.authorize_url()}))
else:
self.redirect('/tasks/')
class TasksHandler(webapp.RequestHandler):
@decorator.oauth_required
def get(self):
tasks = get_tasks()
tasks.sort(key=lambda x: x['due'])
self.response.out.write(template.render('templates/index.html',
{'tasks': tasks}))
application = webapp.WSGIApplication(
[('/', SplashHandler), ('/tasks/', TasksHandler)], debug=True)
答案 0 :(得分:7)
oauth_aware方法旨在明确能够回答“我们是否拥有当前用户的访问令牌?”这一问题。它可以解决这个问题的唯一方法是知道当前用户是谁,并且这样做是使用应用程序引擎用户api,它本身需要一个权限提示,通过您看到的重定向来获取您的电子邮件/用户ID。使用oauth_required,您实际上获得了2个重定向,这个相同的应用引擎,然后是oauth,要求获得G +或Docs或其他任何权限。
我碰巧认为这不是特别有用,我认为你的用例更为常见,但显然图书馆作者不同意。
说,oauth_aware函数中的代码不是很复杂,你可以根据它做不自己的第一次重定向装饰器。不同之处在于,在您的情况下,对同一问题的回答将是“是”或“我不知道”,而不是确定的“否”。