Несколько вариантов аутентификации с Tornado - PullRequest
8 голосов
/ 07 октября 2010

Только начал играть с Торнадо и хочу предложить несколько методов аутентификации. В настоящее время мое приложение работает нормально с гибридным OpenID / oAuth от Google, используя tornado.auth.GoogleMixin, и неаутентифицированные пользователи автоматически отправляются на страницу авторизации Google.

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

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

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

Ответы [ 2 ]

11 голосов
/ 11 октября 2010

Я думаю, что самый простой способ сделать это - изменить AuthLoginHandler на что-то более конкретное, например, 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>

Если вы хотите сделать его более изящным, вы можете указать провайдеров как поле выбора или, если хотите,чтобы ДЕЙСТВИТЕЛЬНО задуматься, вы можете проанализировать их 'openid' URL (например, если username.google.com, self.redirect ("/ login / google"), но это предполагает, что пользователи знают свои URL-адреса провайдера OpenID, что обычно неслучай. Я думаю, если вы дадите им иконку google / facebook / twitter или что-то, на что можно нажать, это сбило бы с толку наименьшее количество людей.

0 голосов
/ 01 апреля 2011

Я столкнулся с этой проблемой сам, но в несколько других обстоятельствах.

Одно из решений - это сделать что-то подобное.

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)
        #...
...