我需要使用來自遠程Auth API的異步回調來編寫身份驗證功能。使用登錄進行簡單身份驗證運行良好,但使用Cookie密鑰進行身份驗證不起作用。它應該檢查cookie中是否存在關鍵字「lp_login」,獲取像異步一樣的API url並執行on_response函數。使用具有異步回調的cookie密鑰進行身份驗證
該代碼幾乎可行,但我看到兩個問題。首先,在on_response函數中,我需要爲每個頁面上的授權用戶設置安全cookie。在代碼中user_id返回正確的ID,但行:self.set_secure_cookie(「用戶」,user_id)不起作用。爲什麼會這樣?
第二個問題。在異步抓取API網址期間,用戶的頁面已經在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