python 产生token及token验证的方法


Posted in Python onDecember 26, 2018

1、前言

最近在做微信公众号开发在进行网页授权时,微信需要用户自己在授权url中带上一个类似token的state的参数,以防止跨站攻击。

在经过再三思考之后,自己试着实现一个产生token和验证token的方案。接下就把code贴出来。希望读者指导一下。

2、产生token

原理:

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

实现:

import time
import base64
import 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")

3、验证token

原理:

将token进行base64解码,通过token得到token最大过期时间戳和消息摘要。判断token是否过期。

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

实现:

import time
import base64
import hmac

def certify_token(key, token):
 r'''
 @Args:
  key: str
  token: str
 @Returns:
  boolean
 '''
 token_str = base64.urlsafe_b64decode(state).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

4、用法

key = "JD98Dskw=23njQndW9D"
# 一小时后过期
token = generate_token(key, 3600)

certify_token(key, token)

5、Note!!!

本代码只能在python3.x 中运行。

以上这篇python 产生token及token验证的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 运算符 供重载参考
Jun 11 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
初探TensorFLow从文件读取图片的四种方式
Feb 06 Python
Python3中的json模块使用详解
May 05 Python
Python对象属性自动更新操作示例
Jun 15 Python
python将回车作为输入内容的实例
Jun 23 Python
Python字符串的一些操作方法总结
Jun 10 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
Python如何在循环内使用list.remove()
Jun 01 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 Python
Django drf请求模块源码解析
Jun 08 Python
Python实现日志实时监测的示例详解
Apr 06 Python
对python捕获ctrl+c手工中断程序的两种方法详解
Dec 26 #Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 #Python
python处理multipart/form-data的请求方法
Dec 26 #Python
Python实现的简单线性回归算法实例分析
Dec 26 #Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 #Python
python使用knn实现特征向量分类
Dec 26 #Python
python调用staf自动化框架的方法
Dec 26 #Python
You might like
杏林同学录(一)
2006/10/09 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
2016/04/19 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
Nodejs实现用户注册功能
2019/04/14 NodeJs
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
详解python中asyncio模块
2018/03/03 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
美国玩具公司:U.S.Toy
2018/05/19 全球购物
static关键字的用法
2013/10/07 面试题
应用心理学个人的求职信
2013/12/08 职场文书
会计专业导师推荐信
2014/03/08 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
2014最新离职证明范本
2014/09/12 职场文书
单独二胎证明
2015/06/24 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书