一、签名cookie 的使用:
1、设置cookie:self.set_secure_cookie(),
2、获取cookie:self.get_secure_cookie(),得到的cookie是bytes类型,需要进行str转换,
3、在settings中,设置加盐:"cookie_secret":"jfoijfoiewfierr",其中后面字符串的内容自定义,为加盐内容,
(在flask中,设置加盐使用“secret_key”)
#!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornado.web class IndexHandler(tornado.web.RequestHandler): # 用户访问,设置了访问权限,并非所有用户都可以访问 def get(self): if self.get_argument('u',None) in ['lucy','alex','luna']: self.set_secure_cookie('name',self.get_argument('u',None),) else: self.write('请登录!') class ManagerHandler(tornado.web.RequestHandler): # 用户签名认证 def get(self): name = str(self.get_secure_cookie('name',None),encoding='utf-8') if name in ['lucy','alex','luna']: self.write( "欢迎登录:" + name ) else: self.redirect("/index") # 路径解析 settings = { "template_path":"views", "static_path":"statics", "cookie_secret":"nifjewoifnewkfcn", } # 二级路由,先匹配域名, application = tornado.web.Application([ (r"/index",IndexHandler), (r"/manager",ManagerHandler), ],**settings) # 开启服务器,监听 if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
二、签名cookie的原理:
(一)假设需要设置的cookie内容为:v1,带签名的cookie生成原理和流程如下:
1、使用base64加密(此加密可反解):V1 = base64(v1),
2、获取当前时间(即cookie设置时间):Time = time.time(),
3、自定义加盐字符串(通过settings在服务器端自定义):加盐字符串,
4、生成新内容:V1+Time+加盐字符串,并对新内容进行MD5加密:加密串 = MD5(V1+Time+加盐字符串),
5、最终传递的cookie内容为:V1 | 加密串 | Time。
(二)客户端携带cookie进行请求访问,服务器获取cookie内容后,需要进行合法性验证,原理和流程如下:
1、根据分割符 ‘ | ’ 进行拆分,获取Time 和 V1,
2、通过base64反解V1,获取原生串v2,
3、根据v2 、Time、加盐字符串的信息,重新计算加密串,若与原内容一致即合法。
浙公网安备 33010602011771号