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使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
python 打印对象的所有属性值的方法
Sep 11 Python
简单谈谈python中的多进程
Nov 06 Python
详解python中的json的基本使用方法
Dec 21 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
详解python 拆包可迭代数据如tuple, list
Dec 29 Python
pandas表连接 索引上的合并方法
Jun 08 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 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/03/11 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
js url传值中文乱码之解决之道
2009/11/20 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
PyTorch基本数据类型(一)
2019/05/22 Python
django rest framework 实现用户登录认证详解
2019/07/29 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
简述 Python 的类和对象
2020/08/21 Python
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
土地转让协议书范本
2014/04/15 职场文书
森林防火标语
2014/06/23 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
实用求职信模板范文
2019/05/13 职场文书
golang http使用踩过的坑与填坑指南
2021/04/27 Golang
PHP获取学生成绩的方法
2021/11/17 PHP
Linux安装apache服务器的配置过程
2021/11/27 Servers