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中的URLError异常的方法
Apr 30 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
Jun 22 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
python配置文件写入过程详解
Oct 19 Python
python实现while循环打印星星的四种形状
Nov 23 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 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中使用Oracle数据库(4)
2006/10/09 PHP
留言板翻页的实现详解
2006/10/09 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
zend framework重定向方法小结
2016/05/28 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
给老婆的搞笑检讨书
2014/01/12 职场文书
民事诉讼代理授权委托书范本
2014/10/08 职场文书
高中班长竞选稿
2015/11/20 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis