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单例模式实例分析
Jan 14 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python paramiko模块的使用示例
Apr 11 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
Matplotlib使用Cursor实现UI定位的示例代码
Mar 12 Python
基于virtualenv创建python虚拟环境过程图解
Mar 30 Python
keras模型保存为tensorflow的二进制模型方式
May 25 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
Python基础之pandas数据合并
Apr 27 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
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
BootStrap中关于Select下拉框选择触发事件及扩展
2016/11/22 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python实现基本线性数据结构
2016/08/22 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
Python实现图片尺寸缩放脚本
2018/03/10 Python
Python实现基于POS算法的区块链
2018/08/07 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
python 读取串口数据的示例
2020/11/09 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
法院实习人员自我鉴定
2013/09/26 职场文书
司仪主持词两篇
2014/03/22 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
遗嘱范文
2015/08/07 职场文书
执行力心得体会范文
2016/01/11 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
java项目构建Gradle的使用教程
2022/03/24 Java/Android