python 产生token及token验证的方法(有效)

python 产生token及token验证的方法(有效),第1张

概述近期再做一个关于登陆的一个 *** 作首先想到的就是产生token和验证token的方案,接下就把code贴出来。产生token:importtimeimportbase64importhmacdefgenerate_token(key,expire=3600):r'''@Args:key:str(用户给定的key,需要用户保存以便之后验证token,每次产

近期再做一个关于登陆的一个 *** 作首先想到的就是产生token和验证token的方案,接下就把code贴出来。

产生token:

import timeimport base64import hmac def generate_token(key, expire=3600): r''' @Args:  key: str (用户给定的key,需要用户保存以便之后验证token,每次产生token时的key 都可以是同一个key)  expire: int(最大有效时间,单位为s) @Return:  state: str ''' ts_str = str(time.time() + expire) ts_byte = ts_str.encode("utf-8") sha1_tshexstr = hmac.new(key.encode("utf-8"),ts_byte,'sha1').hexdigest()  token = ts_str+':'+sha1_tshexstr b64_token = base64.urlsafe_b64encode(token.encode("utf-8")) return b64_token.decode("utf-8")

原理:
通过hmac sha1 算法产生用户给定的key和token的最大过期时间戳的一个消息摘要,将这个消息摘要和最大过期时间戳通过":"拼接起来,再进行base64编码,生成最终的token

验证token:

import timeimport base64import hmac def certify_token(key, token): r''' @Args:  key: str  token: str @Returns:  boolean ''' token_str = base64.urlsafe_b64decode(token).decode('utf-8') token_List = token_str.split(':') if len(token_List) != 2: return False ts_str = token_List[0] if float(ts_str) < time.time(): # token expired return False kNown_sha1_tsstr = token_List[1] sha1 = hmac.new(key.encode("utf-8"),ts_str.encode('utf-8'),'sha1') calc_sha1_tsstr = sha1.hexdigest() if calc_sha1_tsstr != kNown_sha1_tsstr: # token certification Failed return False # token certification success return True

原理:将token进行base64解码,通过token得到token最大过期时间戳和消息摘要。判断token是否过期。如没过期才将 从token中的取得最大过期时间戳进行hmac sha1 算法运算(注意这里的key要与产生token的key要相同),最后将产生的摘要与通过token取得消息摘要进行对比, 如果两个摘要相等,则token有效,否则token无效 。

执行:

key = "JD98Dskw=23njQnDW9D"# 一小时后过期60*60token = generate_token(key, 3600) certify_token(key, token)
总结

以上是内存溢出为你收集整理的python 产生token及token验证的方法(有效)全部内容,希望文章能够帮你解决python 产生token及token验证的方法(有效)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1188366.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存