#封装成Django源码版#依赖Django运行环境,不可单独测试,需运行Django环境,#需要在settings配置文件中配置 OUT_TIME = 时间 ,以秒为单位
importosimporttimeimportbase64importhashlibimportimportlib
ENVIRONMENT_VARIABLE= "DJANGO_SETTINGS_MODULE"
classToken_hander():def __init__(self):
self.out_time=self.getOutTime()
self.time=self.timerpass
deftimer(self):returntime.time()defgetOutTime(self):
module=importlib.import_module(os.environ.get(ENVIRONMENT_VARIABLE))return getattr(module, "OUT_TIME",60) #在settings配置文件中找 OUT_TIME 变量,如果没有,默认60秒
defhax(self,str):"""摘要算法加密
:param str: 待加密字符串
:return: 加密后的字符串"""
if not isinstance(str,bytes): #如果传入不是bytes类型,则转为bytes类型
try:
str= bytes(str,encoding="utf8")exceptBaseException as ex:raise ValueError("'%s'不可被转换为bytes类型"%str)
md5=hashlib.md5()
md5.update("天王盖地虎erafe23".encode(encoding='utf-8'))
md5.update(str)
md5.update("992ksd上山打老虎da".encode(encoding='utf-8'))returnmd5.hexdigest()defbuild_token(self,message):"""hax_message: 待加密字符串内容 格式: '当前时间戳:message:过期时间戳'
:param message: 需要生成token的字符串
:param time: 过期时间
:return: token"""hax_message= "%s:%s:%s"%(str(self.time()),message,
str(float(self.time())+float(self.out_time)))
hax_res=self.hax(hax_message)
token= base64.urlsafe_b64encode(("%s:%s"%(hax_message,hax_res)).encode(encoding='utf-8'))return token.decode("utf-8")defcheck_token(self,token):""":param token: 待检验的token
:return: False or new token"""
try:
hax_res= base64.urlsafe_b64decode(token.encode("utf8")).decode("utf-8")
message_list= hax_res.split(":")
md5= message_list.pop(-1)
message= ':'.join(message_list)if md5 !=self.hax(message):#加密内容如果与加密后的结果不符即token不合法
returnFalseelse:if self.time() - float(message_list.pop(-1)) >0:#超时返回False
returnFalseelse:#token验证成功返回新的token
return self.build_token(message_list.pop(-1))exceptBaseException as ex:#有异常表明验证失败或者传入参数不合法
return False