pyJWT
现在用JWT 加密太火了,怎么能不跟上潮流?否则销售都不好意思出去吹牛逼!
PyJWT是一个Python库,用来编码/解码JWT(JSON Web Token)的
1.定义:根据维基百科的定义,JSON WEB Token(JWT,读作 [/dʒɒt/]),是一种基于JSON的、用于在网络上声明某种主张的令牌(token)。JWT通常由三部分组成: 头信息(header), 消息体(payload)和签名(signature)。
1.1头信息指定了该JWT使用的签名算法:
header = '{"alg":"HS256","typ":"JWT"}'
1.2消息体包含了JWT的意图:
payload = '{"loggedInAs":"admin","iat":1422779638}'//iat表示令牌生成的时间
1.3未签名的令牌由base64url
编码的头信息和消息体拼接而成(使用"."分隔),签名则通过私有的key计算而成
key = 'secretkey'
unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload)
signature = HMAC-SHA256(key, unsignedToken)
2.上代码:摘自https://www.cnblogs.com/liufei1983/p/8546505.html 写都不错,挺清晰的借鉴一下,不过项目里一般都是封装成装饰器,作为接口认证
import datetime, jwt, time
from app.dao.userDao import UserDao
from flask import jsonify
from .. import common
class Auth():
@staticmethod
def encode_auth_token(user_id, login_time):
"""
生成认证Token
:param user_id: int
:param login_time: int(timestamp)
:return: string
"""
try:
payload = {
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=0, seconds=10),
'iat': datetime.datetime.utcnow(),
'iss': 'ken',
'data': {
'id':user_id,
'login_time': login_time
}
}
return jwt.encode(
payload,
'secret',
algorithm='HS256'
)
except Exception as e:
return e @staticmethod
def decode_auth_token(auth_token):
"""
验证Token
:param auth_token:
:return: integer|string
"""
try:
payload = jwt.decode(auth_token, 'secret', options= {'verify_exp':False})
if ('data' in payload and 'id' in payload['data']):
return payload
else:
raise jwt.InvalidTokenError except jwt.ExpiredSignatureError:
return "Token过期"
except jwt.InvalidTokenError:
return "无效的Token" def authenticate(self, username, password):
"""
用户登录,登录成功返回token,写将登录时间写入数据库;登录失败返回失败原因
:param password:
:return: json
"""
userDao = UserDao()
user = userDao.search(username)
if (user is None):
return jsonify(common.falseReturn('', '找不到用户'))
else:
if (user.password == password):
login_time = int(time.time())
token = self.encode_auth_token(user.username, login_time)
return jsonify(common.trueReturn(token.decode(), '登陆成功'))
else:
return jsonify(common.falseReturn('', '密码不正确')) def identify(self, request):
"""
用户鉴权
:return: list
"""
auth_header = request.headers.get('Authorization')
if (auth_header):
auth_tokenArr = auth_header.split(" ")
if (not auth_tokenArr or auth_tokenArr[0]!= 'jwt' or len(auth_tokenArr) != 2 ):
result = common.falseReturn('','请传递正确的验证头信息')
else:
auth_token = auth_tokenArr[1]
payload = self.decode_auth_token(auth_token)
if not isinstance(payload, str):
userDao = UserDao()
user = userDao.search(payload['data']['id'])
if (user is None):
result = common.falseReturn('', '找不到该用户信息')
else:
result = common.trueReturn('', '请求成功')
else:
result = common.falseReturn('', payload)
else:
result = common.falseReturn('','没有提供认证token')
return result
代码说明:
authenticate: 根据用户名/密码,到DB中进行校验,如果是合法的用户名/密码,调用encode_auth_token生成token返回;username加入到token的payload中。
encode_auth_token: 生成token的函数,payload可以存储一些不敏感的信息,比如用户名等,但是不能存密码;还有指定签名算法和秘钥。
identify: 用户的请求需要携带token信息,这个函数对request进行校验,调用decode_auth_token完成的校验。
decode_auth_token: 调用jwt.decode进行token校验(要指定秘钥,秘钥和生成token的秘钥一样)
3.参数详解
exp是expires的简写,是用来指定token的生命周期 iss是issuer的简写,表明请求的实体,可以是发出请求的用户的信息 iss(签发者),exp(过期时间戳), sub(面向的用户), aud(接收方), iat(签发时间)
4.最简单的例子
加密
def _set_token(self, studentMids):
doc = {
'relate_info': {'Phone': Phone,'secret':self.Secret},
'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=JWTConfig.EXP)
}
encodeds = jwt.encode(
doc,
JWTConfig.SECRET_KEY,
algorithm=JWTConfig.ALGORITHM
)
return encodeds
解密(主要还要看你自己写的加密规则来解密)
token = request.headers.get('Authorization') decryptData = token.split(".")[1] + "=" * (4 - len(token.split(".")[1]) % 4)
secret = osjson.loads(base64.b64decode(decryptData))['relate_info']['secret']
separator = encrypt(CUSTOMSECRET, "")
res = secret[::-1].split(str(base64.b64encode(separator.encode('utf-8')),"utf-8"))
5.奉送一个写的不错,特别详细的博客链接https://blog.csdn.net/cruise_h/article/details/50888225
pyJWT的更多相关文章
- flask_login 整合 pyjwt + json 简易flask框架
现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...
- Pyjwt ,python jwt ,jwt
pip install Pyjwt 不错的jwt 文章: https://www.cnblogs.com/wayneiscoming/p/7513487.html Sampleimport jwt i ...
- PyJWT 使用
最近要用 Falsk 开发一个大点的后端,为了安全考虑,弃用传统的Cookie验证.转用JWT. 其实 Falsk 有一个 Falsk-JWT 但是我觉得封装的太高,还是喜欢通用的 PyJWT . J ...
- flask-login 整合 pyjwt + json 简易flask框架
现在很多框架都实现前后端分离,主要为了适应以下几个目的: 1,前后端的分离,可以使前端开发和后端开发更加分工明确,而不是后端还需要在视图模板中加入很多{% XXXX %}标签 2,是为了适应跨域调用或 ...
- 五 pyJWT使用
PyJWT是一个Python库,用来编码/解码JWT(JSON Web Token)的. 1:安装PyJWT 2: 直接上代码了: import datetime, jwt, time from a ...
- PyJWT 详解
1.首先,我们需要先了解 JWT 的概念,所以我们先看pyjwt的官网 https://jwt.io/ 2.对于官方 JWT 有两篇博文写的不错分别如下: https://blog.csdn.net/ ...
- Python 资源大全中文版
Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...
- 使用 AngularJS & NodeJS 实现基于token 的认证应用(转)
认证是任何 web 应用中不可或缺的一部分.在这个教程中,我们会讨论基于 token 的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构 ...
- [转载]Python 资源大全
原文链接:Python 资源大全 环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具. pyenv – 简单的 Python 版本管理工具. Vex ...
随机推荐
- Win7下VS2008安装cocos2d-2.0-x-2.0.4模板时, 运行InstallWizardForVS2008.js文件执行失败的解决办法
今天在Win7环境下的VS2008中安装cocos2d-x模板的过程中,当点击InstallWizardForVS2008.js时,弹出" 没有文件扩展'.js'的脚本引擎&q ...
- jQuery内容过滤选择器再探究(原创)
内容过滤选择器不算复杂,但还是有需要注意的地方
- 在已有QT项目中添加多个UI布局界面
1.在工程中右键->添加新文件,按图选择 2.选择窗口部件 3.创建UI控制类 注意上图红框中命名按实际需要定义,否则后期改动要修改UI文件参数 4.修改UI文件,框1是窗口部件父类,框2是UI ...
- PHP简单导出Excel表格
<?php header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; ...
- teb教程8
融合动态障碍物 简介:考虑怎样把其他节点发布的动态障碍物考虑进来 1.本部分演示了动态障碍物该如何被包含到teb_local_planner中. 2.写一个简单的动态障碍物的发布器publish_dy ...
- ubuntu批量转换所有子文件夹下图片文件格式
第一步按照 sudo apt-get install imagemagick 对于一个文件,可以: convert ubuntuhandbook.png ubuntuhandbook.jpg 对于多个 ...
- C#排序 转
本文链接:https://blog.csdn.net/fysuccess/article/details/36416255 C#中List<T>排序的两种方法 List<Studen ...
- 多核cpu实现多任务原理
- Vuex白话教程第六讲:Vuex的管理员Module(实战篇)
写在前面 这一讲是 Vuex 基础篇的最后一讲,也是最为复杂的一讲.如果按照官方来的话,对于新手可能有点难以接受,所以想了下,决定干脆多花点时间,用一个简单的例子来讲解,顺便也复习一下之前的知识点. ...
- Cesium导出PDF
首先安装 html2Canvas 和 jspdf npm i html2Canvas - S npm i jspdf - S 然后在vue页面引入 import html2Canvas from 'h ...