Frage

Ich habe gerade angefangen mit Tornado zu spielen und möchte mehrere Authentifizierungsmethoden anbieten. Derzeit funktioniert meine App mit der Hybrid OpenID/OAuth von Google mit tornado.auth.googlemixin und den nicht authentifizierten Benutzern werden automatisch an die Auth -Seite von Google gesendet.

Wenn ein nicht authentifizierter Benutzer eine andere Option verwenden möchte (dh lokaler Auth oder tornado.auth.twittermixin), wie kann ich die Logik implementieren, um einen Auth -Mechanismus innerhalb des Anmeldehandlers auszuwählen?

Ich habe den Dekorateur 'Tornado.Web.authenticated' zu allen meinen exponierten Methoden hinzugefügt, und hier ist die My Login Handler -Klasse (ziemlich direkt aus den Tornado -Beispielen), die derzeit mit Google OpenID/OAuth zusammenarbeitet:

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('/')

Schätzen Sie alle Vorschläge für eine Lösung. Vielen Dank

War es hilfreich?

Lösung

Ich denke, der einfachste Weg, es zu tun, wäre, den AuthloginHandler in etwas Spezifischeres wie GoogleAuthhandler zu ändern und dafür eine geeignete Route zu erstellen:

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

usw.

Erstellen Sie dann einfach Links zu jedem Authentifizierungsanbieter auf der Seite ALA:

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

Wenn Sie es schicker machen wollten, können Sie den Anbietern als Select -Box zur Verfügung stellen oder wenn Sie wirklich schick werden möchten, können Sie ihre "OpenID" -RUR (z. B. wenn username.google.com, self.redirect ("analysieren (", z. / login / google "), aber das setzt voraus, dass Benutzer ihre OpenID -URLs von Anbietern kennen, was normalerweise nicht der Fall ist. Ich würde raten, wenn Sie ihnen ein Google / Facebook / Twitter -Symbol gegeben haben, oder etwas, auf das Sie klicken können, würde es am wenigsten verwirren. Anzahl der Personen.

Andere Tipps

Ich bin selbst auf dieses Problem gestoßen, aber unter etwas anderen Umständen.

Eine Lösung besteht tatsächlich darin, so etwas zu tun.

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)
        #...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top