摘要
jwt token 前后端的交互逻辑,此部分只描述了一些交互逻辑,不涉及到真实应用的开发。
token的格式
token=header+‘.’+payload+‘.’+sign
第一次登陆的时候
- 判断http请求头中是否包含Authorization
- 不包含则提示用户未登录
- 当用户登录后,后端生成token返回给前端,生成token逻辑如下
- 生成header
header = {
“alg”: “DES”,
“typ”: “JWT”
}
header_str_64 = base64.encode(header_str)- 生成payload
payload = {
“user_id”:“xx”,
“effective_time”:“过期时间”
}
payload_str_64 = base64.encode(header_str)- 对payload_str_64进行AES加密生成签名
sign=generateSign(payload_str_64)- 生成token
token=header_str_64 + ‘.’ + payload_str_64 + ‘.’ + sign
后端token校验
获取Authorization 中的token
解密进行签名验证
header_str_64 ,payload_str_64 ,sign=token.split(',') #根据请求头中的payload_str_64反向生成签名 #生成的签名和token携带的签名进行比对 #相等则信息检验成功,不相等则表示信息被篡改 sign_now=generateSign(payload_str_64) if sign_new==sign: print("信息校验通过") payload_str = base64.decode(payload_str_64) payload = json.loads(payload_str) payload['effective_time'] = str(app_obj.expire_time) if '当前时间' > effective_time: data = { 'status_code': 401, 'message': 'authorization已过期,请找管理员续时长' } else: return '信息被篡改'
如何进行token自动续时
前面 伪代码 我们的token设计中加入了 effective_time过期时间,在进行用户校验的时候如果token过期了则返回给用户 ‘authorization已过期,请找管理员续时长’,这样做是有缺点的,比如我正在操作一个任务,刚创建好还未保存token过期了,是不是很尴尬,因此实现token自动续时长是很有必要的。就是当用户处于活跃状态的时候实现token自动续时长。
- 前端将登陆后获取到的token缓存到本地
- 每个五分钟检查下token的effective_time时间
- 如果过期了则调用后端接口,后端接口会返回新的token
- 前端更新本地缓存,替换旧的token