刚刚开始玩龙卷风,并希望提供多种身份验证方法。目前,我的应用程序可以使用tornado.auth.googlemixin与Google的Hybrid OpenID/OAuth合作,并且未经许可的用户会自动发送到Google的auth页面。

如果未经验证的用户想使用另一个选项(即本地auth或tornado.auth.twittermixin),我该如何实现逻辑以在登录处理程序中选择验证机制?

我在所有暴露的方法中添加了装饰师的“ Tornado.web.authenticatienated”,这是我目前正在与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('/')

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

有帮助吗?

解决方案

我认为最简单的方法是将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(例如,如果用户name.google.google.com,self.redirect(” /登录 / google”),但假设用户知道他们的OpenID提供商URL,通常不是这样。人数。

其他提示

我本人遇到了这个问题,但在稍微不同的情况下。

一种解决方案实际上是这样做。

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