Question

Tout a commencé à jouer avec Tornado et que vous voulez offrir de multiples méthodes d'authentification. À l'heure actuelle mon application fonctionne bien avec hybride Google qu'OpenID / oAuth en utilisant tornado.auth.GoogleMixin et les utilisateurs non authentifiés sont envoyés automatiquement à la page auth de Google.

Si un utilisateur non authentifié veut utiliser une autre option (ie. Auth local ou tornado.auth.TwitterMixin), comment puis-je mettre en œuvre la logique de choisir un mécanisme d'authentification dans le gestionnaire de connexion?

J'ajouté le décorateur « tornado.web.authenticated » à toutes mes méthodes exposées, et voici le mon gestionnaire de connexion classe (à peu près directement à partir des exemples Tornado) qui travaille actuellement avec 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('/')

Toute suggestion d'une solution. Merci

Était-ce utile?

La solution

Je pense que le comme GoogleAuthHandler, meilleure façon de le faire serait de changer le AuthLoginHandler à quelque chose de plus spécifique, et de créer une voie appropriée pour que:

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

etc.

Ensuite, il suffit de créer des liens à chaque fournisseur d'authentification sur la page ala:

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

Si vous voulez faire colombophile, vous pouvez fournir les fournisseurs comme une boîte de sélection, ou si vous voulez vraiment obtenir la fantaisie, vous pouvez analyser leur « Openid » URL (par exemple, si username.google.com, auto. redirect ( « / login / google »), mais cela suppose que les utilisateurs connaissent leurs URL de fournisseur OpenID, qui est généralement pas le cas. Je suppose que si vous leur donniez un google / facebook / twitter icône ou quelque chose à cliquer sur ce serait confondre le moins nombre de personnes.

Autres conseils

Je suis venu moi-même sur ce problème, mais dans une situation légèrement différente.

Une solution est en fait de faire quelque chose comme ça.

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)
        #...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top