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目录与文件名操作例子
Aug 28 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
itchat-python搭建微信机器人(附示例)
Jun 11 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
Python接口测试结果集实现封装比较
May 01 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
May 13 Python
python两个list[]相加的实现方法
Sep 23 Python
python中字符串的编码与解码详析
Dec 03 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中几种常见的超时处理全面总结
2012/09/11 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
Javascript模块模式分析
2008/05/16 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
理解javascript正则表达式
2016/03/08 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
详解vue.js2.0父组件点击触发子组件方法
2017/05/10 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
Python Queue模块详解
2014/11/30 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
python3爬虫怎样构建请求header
2018/12/23 Python
python多线程下信号处理程序示例
2019/05/31 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python 获取字典键值对的实现
2020/11/12 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
Asics日本官网:鬼冢八喜郎创立的跑鞋运动品牌
2017/10/18 全球购物
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
电影圆明园观后感
2015/06/03 职场文书
2019年教师入党申请书
2019/06/27 职场文书
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python