2010-10-07 18 views
8

Acabo de empezar a jugar con Tornado y quiero ofrecer varios métodos de autenticación. Actualmente, mi aplicación funciona bien con el híbrido OpenID/oAuth de Google con tornado.auth.GoogleMixin y los usuarios no autenticados se envían automáticamente a la página de autenticación de Google.Múltiples opciones de autenticación con Tornado

Si un usuario no autenticado desea usar otra opción (es decir, auth local o tornado.auth.TwitterMixin), ¿cómo puedo implementar la lógica para elegir un mecanismo de autenticación dentro del controlador de inicio de sesión?

añadí el decorador 'tornado.web.authenticated' a todos mis métodos expuestos, y aquí es la clase de mi manejador de inicio de sesión (más o menos directamente de los ejemplos Tornado) que actualmente está trabajando con Google OpenID/OAuth:

class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin): 
    @tornado.web.asynchronous 
    def get(self): 

     if self.get_argument('openid.mode', None): 
      self.get_authenticated_user(self.async_callback(self._on_auth)) 
      return 

     ## redirect after auth 
     self.authenticate_redirect() 

    def _on_auth(self, user): 
     ## auth fail 
     if not user: 
      raise tornado.web.HTTPError(500, 'Google auth failed') 

     ## auth success 
     identity = self.get_argument('openid.identity', None) 

     ## set identity in cookie 
     self.set_secure_cookie('identity', tornado.escape.json_encode(identity)) 
     self.redirect('/') 

Valora cualquier sugerencia que puedas solucionar. Gracias

Respuesta

11

creo que la forma más fácil de hacerlo sería cambiar la AuthLoginHandler a algo más específico, como GoogleAuthHandler, y crear una vía apropiada para ello:

(r"/login/google/", GoogleAuthHandler), 
(r"/login/facebook/", FacebookAuthHandler), 

etc.

Después, simplemente crear enlaces a cada proveedor de autenticación en la página de ala:

<a href="/login/google/>Login with Google</a> 
<a href="/login/facebook/">Login with Facebook</a> 

Si quieres que sea más elegante, que podría proporcionar los proveedores como un selecto cuadro, o si quería REALMENTE ser elegante, podría analizar su URL 'abierta' (por ejemplo, si username.google.com, self.redirect ("/ login/google"), pero eso supone que los usuarios conocen su proveedor de OpenID URLs, que generalmente no es el caso. Supongo que si les dieras un ícono de google/facebook/twitter o algo por lo que hacer clic, eso podría confundir a la menor cantidad de personas.

+0

Gracias por la ayuda. – joet3ch

0

Me encontré con este problema, pero en una circunstancia ligeramente diferente.

Una solución es en realidad hacer algo como esto.

class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin, tornado.auth.TwitterMixin): 

    def get(self): 
     if want_google: 
      tornado.auth.GoogleMixin.get_authenticated_user(self) 
      #... 
     elif want_twitter: 
      tornado.auth.TwitterMixin.get_authenticated_user(self) 
     #... 
Cuestiones relacionadas