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 网页解析HTMLParse的实例详解
Aug 10 Python
Python 基础教程之闭包的使用方法
Sep 29 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
python中的decimal类型转换实例详解
Jun 26 Python
如何使用Python实现自动化水军评论
Jun 26 Python
python使用装饰器作日志处理的方法
Jul 11 Python
python批量图片处理简单示例
Aug 06 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
如何使用python切换hosts文件
Apr 29 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
Python实现视频中添加音频工具详解
Dec 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与MySQL交互使用详解
2006/10/09 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
js CSS操作方法集合
2008/10/31 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
2010/08/16 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
python的几种开发工具介绍
2007/03/07 Python
Python连接DB2数据库
2016/08/27 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
python开头的coding设置方法
2019/08/08 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
大学毕业生通用求职信
2013/09/28 职场文书
英文商务邀请信
2014/01/22 职场文书
铁路个人事迹材料
2014/01/30 职场文书
学生安全教育材料
2014/02/14 职场文书
党员政治学习材料
2014/05/14 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
2015政治思想表现评语
2015/03/25 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
2016党校培训心得体会
2016/01/07 职场文书
《窃读记》教学反思
2016/02/18 职场文书