2012-03-30 9 views
5

Mein Verständnis des Unterschieds zwischen oauth_aware und oauth_required ist, dass keine Autorisierung erzwingt, während required tut, aber das ist nicht, was ich in der Praxis sehe. Ich habe die zwei Webapp RequestHandlers unten, von denen eine get() Methode mit decorator.oauth_aware und die andere mit decorator.oauth_required verziert wird. Wenn ich lokal oder in App Engine aktiv bin, werden beide sofort zum Login-Flow umgeleitet.OAuth2Decorator oauth_aware zwingt Authentifizierung

Das Ziel ist für SplashHandler, den Benutzer einen Link zu geben, um zu autorisieren, wenn sie nicht bereits sind, und wenn sie sind, dann weiterleiten an /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) 

Antwort

7

Die oauth_aware Methode in der Lage sein, endgültig soll die Frage zu beantworten, ‚Haben wir ein Zugriffstoken für den aktuellen Benutzer haben?‘. Die einzige Möglichkeit, dies zu beantworten, besteht darin, zu wissen, wer der aktuelle Benutzer ist, und dazu die App-Engine-Benutzer-API zu verwenden, die ihrerseits eine Eingabeaufforderung erfordert, um Ihre E-Mail/Benutzer-ID über die angezeigten Weiterleitungen zu erhalten. Mit oauth_required bekommst du tatsächlich 2 Weiterleitungen, die gleiche App Engine, dann dann die oauth die um Erlaubnis für G + oder Docs bittet oder was auch immer.

Ich denke, dass dies nicht besonders nützlich ist, ich denke, dass Ihr Anwendungsfall viel häufiger ist, aber offensichtlich der Bibliothek-Autor nicht zustimmt.

Sagen, dass der Code innerhalb der oauth_aware-Funktion nicht sehr kompliziert ist, können Sie Ihren eigenen Dekorateur darauf basierend machen, der die erste Umleitung nicht tut. Der Unterschied besteht darin, dass in Ihrem Fall die Antwort auf dieselbe Frage entweder "Ja" oder "Ich weiß nicht" lautet, niemals ein endgültiges "Nein".

+0

Danke dafür - das macht sehr viel Sinn. Ich würde zustimmen, dass mein Anwendungsfall wahrscheinlich häufiger ist, aber ich bin voreingenommen (: Ich werde mir die Quelle für 'oauth_aware' ansehen und meine eigene schreiben. Nochmals vielen Dank! –

Verwandte Themen