2012-03-30 9 views
5

Mi comprensión de la diferencia entre oauth_aware y oauth_required es que aware no fuerza la autorización, mientras que required hace, pero eso no es lo que estoy viendo en la práctica. Tengo los dos RequestHandlers de webapp a continuación, uno de cuyos get() método está decorado con decorator.oauth_aware y el otro con decorator.oauth_required. Sin embargo, cuando ejecuto localmente o en App Engine, ambos redireccionan inmediatamente al flujo de inicio de sesión.fuerzas OAuth2Decorator oauth_aware autenticación

El objetivo es que SplashHandler le proporcione al usuario un enlace para autorizar si aún no lo está y, si lo está, reenviarlo al /tasks/.

método
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) 

Respuesta

7

El oauth_aware pretende ser definitiva en ser capaz de responder a la pregunta '¿Tenemos un token de acceso para el usuario actual?'. La única forma de que pueda responder esto es saber quién es el usuario actual, y para ello utiliza la API de los usuarios de la aplicación, que a su vez requiere un permiso para obtener su correo electrónico/ID de usuario a través de los redireccionamientos que está viendo. Con oauth_required obtienes 2 redireccionamientos, este mismo motor de aplicación uno, luego el que solicita permiso para G + o Docs o lo que sea.

Creo que esto no es particularmente útil, creo que su caso de uso es mucho más común, pero obviamente el autor de la biblioteca no está de acuerdo.

Dicho eso, el código dentro de la función oauth_aware no es muy complicado, puedes hacer tu propio decorador basado en él que no haga la primera redirección. La diferencia será que en su caso la respuesta a la misma pregunta será 'Sí' o 'No sé', nunca un 'No' definitivo.

+0

Gracias por esto, tiene mucho sentido. Estoy de acuerdo en que mi caso de uso es probablemente más común, pero estoy predispuesto (: echaré un vistazo a la fuente de 'oauth_aware' y escribiré la mía. ¡Gracias de nuevo! –

Cuestiones relacionadas