Мне нужно написать функцию аутентификации с асинхронным обратным вызовом из удаленного API Auth. Простая аутентификация с логином работает хорошо, но авторизация с ключом cookie не работает. Он должен проверять, есть ли в файлах cookie ключ «lp_login», получить URL-адрес API, например async, и выполнить функцию on_response.Аутентификация с использованием ключа cookie с асинхронным обратным вызовом
Код почти работает, но я вижу две проблемы. Во-первых, в функции on_response мне нужно настроить безопасный файл cookie для авторизованного пользователя на каждой странице. В коде user_id возвращает правильный идентификатор, но строка: self.set_secure_cookie («user», user_id) не работает. Почему это может быть?
И вторая проблема. В URL-адресе API асинхронной выборки пользовательская страница загрузилась до настройки cookie on_response с ключом «пользователь», и страница будет иметь несанкционированный раздел со ссылкой для входа в систему или входа в систему. Это будет путать пользователей. Чтобы решить эту проблему, я могу остановить загрузку страницы для пользователя, который пытается загрузить первую страницу сайта. Можно ли и как? Может быть, проблема имеет более правильный способ ее решения?
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