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之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python实现的rsa加密算法详解
Jan 24 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
Python 3.8中实现functools.cached_property功能
May 29 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
pyinstaller参数介绍以及总结详解
Jul 12 Python
python字符串格式化方式解析
Oct 19 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
Python实现AI换脸功能
Apr 10 Python
PyTorch中的torch.cat简单介绍
Mar 17 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
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
js实现日历的简单算法
2017/01/24 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
用Python实现一个简单的线程池
2015/04/07 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
名片管理系统python版
2018/01/11 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
升职演讲稿范文
2014/05/23 职场文书
2015年见习期工作总结
2014/12/12 职场文书
支教个人总结
2015/03/04 职场文书
门卫管理制度范本
2015/08/05 职场文书