Je dois écrire une fonction d'authentification avec un rappel asynchrone à partir de l'API d'authentification distante. L'authentification simple avec connexion fonctionne bien, mais l'autorisation avec la clé cookie ne fonctionne pas. Il devrait vérifier si dans les cookies présents la clé "lp_login", récupérer l'URL de l'API comme async et exécuter la fonction on_response.Authentification à l'aide d'une clé cookie avec rappel asynchrone
Le code fonctionne presque, mais je vois deux problèmes. Tout d'abord, dans la fonction on_response, je dois configurer un cookie sécurisé pour l'utilisateur autorisé sur chaque page. Dans le code, id_utilisateur renvoie l'ID correct, mais la ligne: self.set_secure_cookie ("utilisateur", id_utilisateur) ne fonctionne pas. Pourquoi ça peut être?
Et deuxième problème. Au cours de l'URL de l'API async fetch, la page de l'utilisateur a été chargée avant le cookie d'installation on_response avec la clé "user" et la page contient une section non autorisée avec un lien pour se connecter ou se connecter. Ce sera déroutant pour les utilisateurs. Pour le résoudre, je peux arrêter de charger la page pour l'utilisateur qui essaie de charger la première page du site. Est-il possible de faire et comment? Peut-être que le problème a une façon plus correcte de le résoudre?
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