这次使用的Django框架, 由于http协议本身是一个无状态的协议, 就意味着用户需要每次向我们服务器发起请求进行验证,因为是是http协议,所以我们不知道是哪一个用户, 为了解决这个问题,我们一般在服务器保存一份用户的登录信息, 传递给浏览器, 保存在cookie中, 一边下次进行识别。但是这种认证会随着用户的增加, 服务器会损耗性能。而且是保存在cookie中, 根据浏览器的同源策略, 也不是很安全。
jwt的构成:字符串
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
header
jwt的头部承载两部分信息:
声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
转换成json字符串进行 json.dumps转换
第二部分:
识别用户的额外信息
第三部分:
头部加密的字符串, 载荷加密的字符串, secret
三部分注成进行加密
加密的结果作为第三部分值
基于token认证的流程:
1、用户使用用户名密码来post请求服务器
2、服务器进行验证用户的信息
3、服务器通过验证生成token 发送给用户一个token
4、客户端存储(取出response.data.token)token(sessionStorage关闭浏览器之后会消失,本次有效和localStorage长期数据),并在每次请求时报文附送上这个token值
5、服务端验证token值,发现是否改变, 改变了则不认可,未改变并返回数据
使用jwt的扩展, 手动签发jwt的方法
注册成功时返回token, 在视图中创建token, 前端也进行token
前端是放在请求头当中,然后进行后端检查
校验的时候: 1. 头部 ->加密计算的方法, 2. 载荷 -->具体数据 3. 头部+载荷+secret--> 加密算法计算 的签名值 和 前三部分值进行对比,是否发生改变.
我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里,我们保存在浏览器本地存储中
浏览器的本地存储提供了sessionStorage 和 localStorage 两种:
sessionStorage 浏览器关闭即失效
localStorage 长期有效