【问题标题】:Multiple authentication options with TornadoTornado 的多个身份验证选项
【发布时间】:2010-10-07 19:16:58
【问题描述】:

刚开始玩 Tornado,想提供多种身份验证方法。目前,我的应用使用 tornado.auth.GoogleMixin 与 Google 的混合 OpenID/oAuth 配合良好,未经身份验证的用户会自动发送到 Google 的身份验证页面。

如果未经身份验证的用户想要使用其他选项(即本地身份验证或 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('/')

感谢任何有关解决方案的建议。谢谢

【问题讨论】:

    标签: python authentication tornado


    【解决方案1】:

    我认为最简单的方法是将 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”网址(例如,如果 username.google.com、self.重定向(“/登录/谷歌”),但假设用户知道他们的 OpenID 提供者 URL,通常情况并非如此。我猜你是否给了他们一个 google / facebook / twitter 图标或点击它的东西迷惑最少的人。

    【讨论】:

      【解决方案2】:

      我自己也遇到过这个问题,但情况略有不同。

      一个解决方案实际上是做这样的事情。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-01
        • 2013-02-08
        相关资源
        最近更新 更多