刚开始玩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('/')
感谢任何有关解决方案的建议。感谢
答案 0 :(得分:11)
我认为最简单的方法是将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,我自己。重定向(“/ login / google”),但假设用户知道他们的OpenID提供商网址,通常情况并非如此。我猜你是否给了他们谷歌/脸书/推特/推特图标或点击的东西混淆了最少的人。
答案 1 :(得分:0)
我自己发现了这个问题,但情况略有不同。
实际上,一种解决方案就是做这样的事情。
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)
#...