JWT模式下生成token加解密
1 from datetime import datetime, timedelta 2 from config import settings 3 import jwt 4 import arrow as ar 5 import requests as req 6 7 8 def get_web_now_time(): 9 try: 10 res = req.get('https://www.baidu.com/').headers['Date'] 11 time_diff = ar.get(res[4:-4], 'DD MMM YYYY HH:mm:ss') - ar.now().floor('second') 12 """ 13 web_now_time = (ar.now() + time_diff) web_now_time的类型是arrow.Arrow.arrow需要转换成datatime.datatime类型 14 """ 15 web_now_time = (ar.now() + time_diff).datetime 16 return web_now_time 17 except BaseException as e: 18 return '获取网络时间出错,出错原因:{}'.format(e) 19 20 21 def create_access_token(data: dict): 22 """ 23 创建token 24 :param data: 加密数据 25 :return: jwt 26 """ 27 token_data = data.copy() 28 """ 29 utcnow() utc是世界时 不管你设置的是哪个时区 utcnow()也是获取服务器事件 30 datetime.now() 获取当前服务器的时间 31 为什么要用get_web_now_time() get_web_now_time()获取的是baidu的网络时间为了避免当前服务器出错 32 timedelta 延迟时间 33 JWT_SECRET_KEY = "WangYafengisahandsomeman2022" 34 JWT_ALGORITHM = "HS256" 35 JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 24 * 60 * 7 36 """ 37 # token超时时间 38 # expire = datetime.utcnow() + timedelta(minutes=settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES) 39 # expire = datetime.now() + timedelta(minutes=settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES) 40 expire =get_web_now_time() + timedelta(minutes=settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES) 41 # 向jwt加入超时时间 42 token_data.update({"exp": expire}) 43 # jwt加密 44 jwt_token = jwt.encode(token_data, settings.JWT_SECRET_KEY, algorithm=settings.JWT_ALGORITHM) 45 return jwt_token 46 47 48 print(get_web_now_time()) 49 print(create_access_token({"name": "wyf", "password": "123456"}))
运行结果:
2022-09-08 11:01:47.689998+08:00
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoid3lmIiwicGFzc3dvcmQiOiIxMjM0NTYiLCJleHAiOjE2NjI2OTI1MDd9.VfSrHNv8mAxKQ75ogkfhYEGCwoB1HbRPWwZMxrQt0HI
解密:
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoid3lmIiwicGFzc3dvcmQiOiIxMjM0NTYiLCJleHAiOjE2NjMyMjU4ODZ9.hFTbjdD4BlsMSWOlgQ9vLiDtwpRTa_mQkcnETIIKXng"
payload = jwt.decode(token, settings.JWT_SECRET_KEY, algorithms=[settings.JWT_ALGORITHM])
print(payload)