Domanda

appena iniziato a giocare con Tornado e vuole offrire molteplici metodi di autenticazione. Attualmente la mia applicazione sta funzionando benissimo con ibrido di Google OpenID / oAuth utilizzando gli utenti non autenticati tornado.auth.GoogleMixin e vengono inviati automaticamente alla pagina di autenticazione di Google.

Se un utente non autenticato vuole usare un'altra opzione (auth es. Locale o tornado.auth.TwitterMixin), come posso implementare la logica di scegliere un meccanismo di autenticazione all'interno del gestore di accesso?

ho aggiunto il decoratore 'tornado.web.authenticated' a tutti i miei metodi esposti, e qui è la classe di mio gestore di login (più o meno direttamente dagli esempi Tornado), che sta attualmente lavorando 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('/')

apprezzare qualche suggerimento per una soluzione. Grazie

È stato utile?

Soluzione

Penso che il modo più semplice per farlo sarebbe quello di cambiare l'AuthLoginHandler a qualcosa di più specifico, come GoogleAuthHandler, e creare una via adeguata per questo:

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

ecc.

Poi semplicemente creare collegamenti ad ogni provider di autenticazione nella pagina di ala:

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

Se si voleva rendere più elaborato, è in grado di fornire i fornitori come una casella di selezione, o se si voleva ottenere veramente fantasia, è in grado di analizzare il loro 'OpenID' URL (ad esempio, se username.google.com, auto. redirect ( "/ login / Google"), ma che assume che gli utenti sappiano loro URL provider OpenID, che di solito non è il caso. direi se ti ha dato loro un google / facebook / twitter icona o qualcosa di cliccare su che avrebbe confondere il minor numero di persone.

Altri suggerimenti

mi sono imbattuto in questo problema me stesso, ma in una circostanza leggermente diversa.

Una soluzione è in realtà per fare qualcosa di simile.

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)
        #...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top