一、前言
安装jwt依赖
pip install pyjwt==2.6.0
ps:
- pyjwt2+的版本兼容python3+
- pyjwt1+的版本兼容python2+
- pyjwt2+和pyjwt1+的使用方法有差异,本人写的是pyjwt2+的使用方法,如果使用pyjwt1+的话本方法应该跑不通
二、使用方法
import time
import jwt
class MyJwt(object):
def __init__(self):
self.expire_time = 3600 * 24 * 3 # token时效3天
self.key = '(^*$#GH(UHB767gds9022/*--' # 秘钥
self.algorithm = 'HS256' # 加密算法
def generate_token(self, payload):
'''
生成token
:return:
'''
payload['exp'] = int(time.time()) + self.expire_time
token = jwt.encode(payload, self.key, algorithm=self.algorithm)
return token
def get_payload_from_token(self, token):
'''
解析token中的payload值
state: 0 token解析失败, 1 token解析成功, 2 token过期, 3 token时间过半
:return:
'''
try:
pl = jwt.decode(token, self.key, algorithms=[self.algorithm])
exp = int(pl.pop('exp'))
if time.time() > exp:
print('token过期') # 该状态让用户重新登录
state = 2
payload = pl
elif time.time() > exp-self.expire_time/2:
print('token时间过半') # 该状态可以进行token的续签,获取新token保持登录状态
state = 3
payload = pl
else:
print('token解析成功') # 该状态继续执行相关业务即可
state = 1
payload = pl
except jwt.PyJWTError:
print('token解析失败') # 该状态说明有老6来了
state = 0
payload = None
return state, payload
if __name__ == '__main__':
# 用户字典
payload = {'user_id': 1, 'username': 'admin'}
# 初始化类
mj = MyJwt()
# 生成token,加密字典
token = mj.generate_token(payload)
print(f"token: {token}")
# token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjcwMjA5MTUzfQ.xF2uGkOydbxyVhWqMXuxJMn_KH6x-Xh0zICQdRkv3zM
# 解析token,解析字典
state, pyload = mj.get_payload_from_token(token)
print(f"state: {state}, pyload: {pyload}")
# state: 1, pyload: {'user_id': 1, 'username': 'admin'}