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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
Python中有趣在__call__函数
Jun 21 Python
python如何查看系统网络流量的信息
Sep 12 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
python 2.7.14安装图文教程
Apr 08 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
Python改变对象的字符串显示的方法
Aug 01 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
用python对excel查重
Dec 07 Python
python实现代码审查自动回复消息
Feb 01 Python
TensorFlow的环境配置与安装方法
Feb 20 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 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/11/10 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
微信小程序 教程之引用
2016/10/18 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
python selenium循环登陆网站的实现
2019/11/04 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
Python如何读写CSV文件
2020/08/13 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
商业项目策划方案
2014/06/05 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
Python requests用法和django后台处理详解
2022/03/19 Python