opzioni di autenticazione multipli con Tornado
-
28-09-2019 - |
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
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)
#...