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中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
Python中生成器和yield语句的用法详解
Apr 17 Python
python安装以及IDE的配置教程
Apr 29 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
Python骚操作之动态定义函数
Mar 26 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
python查看数据类型的方法
Oct 12 Python
python随机生成库faker库api实例详解
Nov 28 Python
如何基于python操作json文件获取内容
Dec 24 Python
python 高阶函数简单介绍
Feb 19 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
PDO::setAttribute讲解
2019/01/29 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
js 利用className得到对象的实现代码
2011/11/15 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
用pycharm开发django项目示例代码
2018/10/24 Python
python计算n的阶乘的方法代码
2019/10/25 Python
Pytorch之finetune使用详解
2020/01/18 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
Lookfantastic俄罗斯:欧洲在线化妆品零售商
2019/08/06 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
入党积极分子自我鉴定范文
2014/03/25 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
质检员工作总结2015
2015/04/25 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS