使用具有异步回调的cookie密钥进行身份验证

时间:2010-05-17 12:16:50

标签: python authentication asynchronous tornado

我需要使用来自远程Auth API的异步回调编写身份验证功能。使用登录进行简单身份验证效果很好,但使用cookie密钥进行授权不起作用。它应该检查cookie中是否存在关键字“lp_login”,获取类似异步的API网址并执行on_response函数。

代码几乎可以工作,但我看到两个问题。首先,在on_response函数中,我需要在每个页面上为授权用户设置安全cookie。在代码中,user_id返回正确的ID,但是行:self.set_secure_cookie(“user”,user_id)不起作用。为什么会这样?

第二个问题。在异步获取API网址期间,用户的页面在使用密钥“user”的on_response安装cookie之前加载,并且该页面将包含未经授权的部分,其中包含登录或登录的链接。这会让用户感到困惑。为了解决这个问题,我可以为试图加载网站首页的用户停止加载页面。有可能吗?怎么做?也许问题有更正确的方法来解决它?

class BaseHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get_current_user(self):
        user_id = self.get_secure_cookie("user")
        user_cookie = self.get_cookie("lp_login")
        if user_id:
            self.set_secure_cookie("user", user_id)
            return Author.objects.get(id=int(user_id))
        elif user_cookie:
            url = urlparse("http://%s" % self.request.host)
            domain = url.netloc.split(":")[0]
            try:
                username, hashed_password = urllib.unquote(user_cookie).rsplit(',',1)
            except ValueError:
                # check against malicious clients
                return None
            else:
                url = "http://%s%s%s/%s/" % (domain, "/api/user/username/", username, hashed_password)
                http = tornado.httpclient.AsyncHTTPClient()
                http.fetch(url, callback=self.async_callback(self.on_response))
        else:
            return None

    def on_response(self, response):
        answer = tornado.escape.json_decode(response.body)
        username = answer['username']
        if answer["has_valid_credentials"]:
            author = Author.objects.get(email=answer["email"])
            user_id = str(author.id)
            print user_id # It returns needed id
            self.set_secure_cookie("user", user_id) # but session can's setup

1 个答案:

答案 0 :(得分:3)

您似乎在龙卷风邮件列表here

上交叉发布此内容

您遇到的一个问题是您无法在get_current_user内启动异步调用,您只能从get或{{}内发生的异步调用启动异步调用1}}。

我没有对它进行测试,但我认为这可以让你接近你想要的东西。

post