一、签名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()
View Code

二、签名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、加盐字符串的信息,重新计算加密串,若与原内容一致即合法。