Несколько вариантов аутентификации с торнадо

StackOverflow https://stackoverflow.com/questions/3885085

  •  28-09-2019
  •  | 
  •  

Вопрос

Просто начал играть с торнадо и хотите предложить несколько методов аутентификации. В настоящее время мое приложение работает нормально, с гибридом Google OpenID / OAUTH / OAUTH Google с использованием TORNADO.AUTH.GOOGLEMIXIN, а неэтапные пользователи автоматически отправляются на страницу автосистемы Google.

Если неаутентифицированный пользователь хочет использовать другой вариант (т. Е. Локальный auth или tornado.auth.twittermixin), как я могу реализовать логику, чтобы выбрать механизм аутентификации в обработке входа в систему?

Я добавил декоратор 'Tornado.web.authenticanted' для всех моих открытых методов, и вот мой класс обработчика входа в систему (в значительной степени прямой из примеров TORNADO), который в настоящее время работает с 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('/')

Цените любые предложения для решения. Спасибо

Это было полезно?

Решение

Я думаю, что самый простой способ сделать это, чтобы изменить AuthLoginhnhandler на что-то более конкретное, как GoogleauthHandler, и создать подходящий путь к этому:

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

и т. д.

Затем просто создайте ссылки на каждый поставщик аутентификации на странице ALA:

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

Если вы хотите сделать его Fancier, вы можете предоставить поставщикам в качестве окна выбора, или если вы хотите получить действительно фантазии, вы могли бы разобрать URL-адрес «OpenID» (например, если username.Google.com, Self.redirect (» / login / Google "), но это предполагает, что пользователи знают свои URL-адрес поставщика OpenID, что обычно не так. Я думаю, если вы дали им значок Google / Facebook / Twitter или что нажать на это число людей.

Другие советы

Я пришел на эту проблему самому, но в немного разных обстоятельствах.

Одно решение на самом деле делать что-то вроде этого.

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)
        #...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top