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 03 Python
谈谈python中GUI的选择
Mar 01 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
Python元组知识点总结
Feb 18 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
Python画图实现同一结点多个柱状图的示例
Jul 07 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
PyTorch安装与基本使用详解
Aug 31 Python
python 动态绘制爱心的示例
Sep 27 Python
python IP地址转整数
Nov 20 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
Python如何识别银行卡卡号?
Jun 10 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目录操作实例代码
2014/02/21 PHP
php按单词截取字符串的方法
2015/04/07 PHP
php使用正则验证中文
2016/04/06 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
JavaScript中的anchor()方法使用详解
2015/06/08 Javascript
JavaScript清空数组元素的两种方法简单比较
2015/07/10 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
两种js监听滚轮事件的实现方法
2016/05/13 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
基于jQuery使用Ajax动态执行模糊查询功能
2018/07/05 jQuery
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
js实现时钟定时器
2020/03/26 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
jQuery实现简单评论功能
2020/08/19 jQuery
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
Python正则表达式介绍
2012/08/06 Python
python中mechanize库的简单使用示例
2014/01/10 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
Python argparse模块应用实例解析
2019/11/15 Python
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
党员先进性教育整改措施
2014/09/18 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
2019假期福利管理制度!
2019/07/15 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
利用Apache Common将java对象池化的问题
2022/06/16 Servers