Tornado的多种身份验证选项

joe*_*3ch 8 python authentication tornado

刚开始玩Tornado并希望提供多种身份验证方法.目前,我的应用程序与使用tornado.auth.GoogleMixin的Google混合OpenID/oAuth正常运行,未经身份验证的用户会自动发送到Google的身份验证页面.

如果未经身份验证的用户想要使用其他选项(即local auth或tornado.auth.TwitterMixin),我如何实现逻辑以在登录处理程序中选择auth机制?

我将装饰器'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('/')
Run Code Online (Sandbox Code Playgroud)

感谢任何解决方案的建议.谢谢

bme*_*ton 11

我认为最简单的方法是将AuthLoginHandler更改为更具体的内容,例如GoogleAuthHandler,并为此创建适当的路由:

(r"/login/google/", GoogleAuthHandler),
(r"/login/facebook/", FacebookAuthHandler),
Run Code Online (Sandbox Code Playgroud)

等等

然后只需在页面ala上创建指向每个身份验证提供程序的链接:

<a href="/login/google/>Login with Google</a>
<a href="/login/facebook/">Login with Facebook</a>
Run Code Online (Sandbox Code Playgroud)

如果你想让它变得更加漂亮,你可以将提供者作为选择框提供,或者如果你想真正想要,你可以解析他们的'openid'URL(例如,如果是username.google.com,self.redirect("/login/google"),但假设用户知道他们的OpenID提供商网址,通常情况并非如此.我猜你是否给了他们一个google/facebook/twitter图标或点击的内容会让人感到困惑人数.