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实现根据图标提取分类应用程序实例
Sep 28 Python
Python中threading模块join函数用法实例分析
Jun 04 Python
详解Python多线程
Nov 14 Python
TensorFlow损失函数专题详解
Apr 26 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
用Python爬取QQ音乐评论并制成词云图的实例
Aug 24 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
python上传时包含boundary时的解决方法
Apr 08 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
xml+php动态载入与分页
2006/10/09 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
destoon各类调用汇总
2014/06/20 PHP
php常用文件操作函数汇总
2014/11/22 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
PHP dirname(__FILE__)原理及用法解析
2020/10/28 PHP
理解JSON:3分钟课程
2011/10/28 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
Python使用struct处理二进制的实例详解
2017/09/11 Python
python 将数据保存为excel的xls格式(实例讲解)
2018/05/03 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
自我评价怎么写好呢?
2013/12/05 职场文书
植树造林的宣传标语
2014/06/23 职场文书
2014学生会工作总结报告
2014/12/02 职场文书
暂停营业通知
2015/04/25 职场文书
2015年新教师工作总结
2015/04/28 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers