2012-03-30 14 views
5

Moje zrozumienie różnicy między oauth_aware i oauth_required że aware nie wymusza autoryzację, natomiast required robi, ale to nie to co widzę w praktyce. Mam poniżej dwie aplikacje ApplicationHandlers, z których jedna z nich jest w stylu decorator.oauth_aware, a druga z decorator.oauth_required. Jednak gdy uruchomię lokalnie lub na App Engine, obie natychmiast przekierują do przepływu logowania.siły OAuth2Decorator oauth_aware uwierzytelniania

Celem jest dla użytkownika SplashHandler nadanie użytkownikowi łącza do autoryzacji, jeśli jeszcze nim nie jest, a jeśli tak, to przesłanie dalej: /tasks/.

metoda
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) 

Odpowiedz

7

oauth_aware ma być ostateczne jest w stanie odpowiedzieć na pytanie „Czy mamy token dostępu dla bieżącego użytkownika?”. Jedyny sposób, aby odpowiedzieć na to pytanie, to wiedzieć, kto jest aktualnym użytkownikiem, a do tego używa api aplikacji Engine Engine App. Samo żądanie uprawnień wymaga podania adresu e-mail/identyfikatora użytkownika za pośrednictwem przekierowań, które widzisz. Z oauth_required otrzymujesz 2 przekierowania, ten sam silnik aplikacji, potem oauth, który prosi o pozwolenie na G + lub Dokumenty lub cokolwiek innego.

Myślę, że nie jest to szczególnie przydatne, myślę, że Twój przypadek użycia jest znacznie bardziej powszechny, ale oczywiście autor Biblioteki nie zgadza się z tym.

Mówiąc, że kod wewnątrz funkcji oauth_aware nie jest bardzo skomplikowany, możesz stworzyć własny dekorator, który nie wykona pierwszego przekierowania. Różnica polega na tym, że w twoim przypadku odpowiedź na to samo pytanie będzie "Tak" lub "Nie wiem", nigdy ostateczna "Nie".

+0

Dzięki za to - to ma wiele sensu. Zgadzam się, że mój przypadek użycia jest prawdopodobnie bardziej powszechny, ale jestem stronniczy (: przyjrzę się źródłu 'oauth_aware' i napiszę. –