我需要使用来自远程 Auth API 的异步回调编写身份验证函数。使用登录的简单身份验证运行良好,但使用 cookie 密钥的授权不起作用。它应该检查 cookie 中是否存在密钥“lp_login”,像异步一样获取 API url 并执行 on_response 函数。
该代码几乎可以工作,但我看到了两个问题。首先,在 on_response 函数中,我需要在每个页面上为授权用户设置安全 cookie。在代码中 user_id 返回正确的 ID,但 line: self.set_secure_cookie("user", user_id) 不起作用。为什么会这样?
第二个问题。在异步获取 API url 期间,用户的页面在 on_response 设置 cookie 之前已加载,密钥为“user”,并且该页面将包含一个未经授权的部分,其中包含用于登录或登录的链接。这会让用户感到困惑。为了解决这个问题,我可以停止为尝试加载网站首页的用户加载页面。有可能做吗?怎么做?也许这个问题有更正确的方法来解决它?
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