【Python_Flask系列之_JWT+Redis的token管理(包含失效)】
文章目录
前言
一、JWT是什么?
简单点说就是一种认证机制,让后台知道该请求是来自于受信的客户端。
二、使用步骤
1.引入库
代码如下(示例):
import jwt
from jwt import exceptions
2.生成token
代码如下(示例):
# 生成token
def create_token(username):
# 构造payload
obj = User.query.filter_by(username=username).first()
uuid = obj.uuid
payload = {
"username": username,
"uuid": uuid, # 用户id
"exp": datetime.datetime.now() + datetime.timedelta(hours=2) # 超时时间
}
result = jwt.encode(payload=payload, key=SALT, algorithm="HS256", headers=headers)
return result
3.校验token
代码如下(示例):
# 校验token
def verify_jwt(token, secret=None):
"""
校验jwt
:param token: jwt
:param secret: 秘钥
:return: dict:payload
"""
if not secret:
secret = Config.SECRET_KEY
try:
payload = jwt.decode(token, secret, algorithms=["HS256"])
return payload
except exceptions.ExpiredSignatureError: # token已失效
return 1
except jwt.DecodeError: # token认证失败
return 2
except jwt.InvalidTokenError: # 非法的token
return 3
4.JWT+Redis的token管理(包含失效)
1)、生成token并存入redis中
2)、携带token请求数据
3)、不携带/错误的token请求数据
4)、登录退出使得token失效
5)、再次使用登录退出前的token,token已经失效
总结
本次使用了白名单的思路,登录时将token存入redis中,登录退出时将token移除redis中,登录退出后原来的token已失效,无法使用之前的token,需要再次登录获取新的token操作业务。