Python JWT认证与pyjwt包详细介绍
作者:alwaysrun 发布时间:2022-04-28 23:52:31
JWT是一种JSON的行业标准,广泛应用在系统的用户认证方面。
JWT认证简介
JWT(JSON Web Tokens),是为了在网络应用环境间传递声明而执行的一种开放的行业标准(RFC7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
构成
JWT就是由三段信息构成,通过点号.
连接的一段字符串,如:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoidGVzdCIsImV4cCI6MTY4NDQwOTE4MH0.K-nvXX3kS0I0RKny0J33tuns7SFttYhQwAUtqOS40aw
第一部分为头部(header,base64编码):
声明类型:jwt;
声明加密算法:如’HS256’。
{
'typ': 'JWT',
'alg': 'HS256'
}
第二部分为载荷(payload,base64编码),存放认证信息、有效期等:
{
"user_id":"test",
"exp":1684410152
}
第三部是签名(使用第一部分声明的算法进行HASH处理),Hash内容:
header (base64后的)
payload (base64后的)
secret:加密盐
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
载荷声明
标准中注册的payload声明 (建议但不强制使用) :
iss: jwt签发者;
sub: jwt所面向的用户;
aud: 接收jwt的一方;
exp: jwt的过期时间,这个过期时间必须要大于签发时间;过期解码会抛出ExpiredSignatureError异常;
nbf: 定义在什么时间之前,该jwt都是不可用的;在此时间之前解码会抛出ImmatureSignatureError异常;
iat: jwt的签发时间;在此时间之前解码会抛出InvalidIssuedAtError异常;
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
注意:不要在jwt的payload部分存放敏感信息,该部分是客户端可加码的。
pyjwt
使用前先安装pip install pyjwt
。
编解码
在pyjwt中通过encode进行编码,通过decode进行解码。
import jwt
JWT_TOKEN_EXPIRE_SECONDS = 3600 * 2 # token有效时间 2小时
JWT_TOKEN_SECRET_SALT = 'salt.2023.05.18'
JWT_TOKEN_ALGORITHM = 'HS256' # HASH算法
def generate_jwt_token(user: str) -> str:
"""根据用户id生成token"""
data = {'user_id': user, 'exp': int(time.time()) + JWT_TOKEN_EXPIRE_SECONDS}
print("generate data:", data)
jwtToken = jwt.encode(data, JWT_TOKEN_SECRET_SALT, algorithm=JWT_TOKEN_ALGORITHM)
return jwtToken
def verify_jwt_token(user: str, jwtToken: str) -> bool:
"""验证用户token"""
data = {'user_id': user}
try:
payload = jwt.decode(jwtToken, JWT_TOKEN_SECRET_SALT, algorithms=[JWT_TOKEN_ALGORITHM])
print("verify:", payload)
exp = int(payload.pop('exp'))
if time.time() > exp:
print('已失效')
return False
return data == payload
except jwt.exceptions.ExpiredSignatureError as ex:
print('token签名过期:', ex)
except jwt.PyJWTError as ex:
print('token解析失败:', ex)
return False
flask中验证
flask是一个轻量级的web框架,可方便与jwt结合进行验证。
先定义一个修饰器(token通过header来携带):
from flask import Flask, request
from functools import wraps
def request_token_validate(f):
@wraps(f)
def toValidate(*args, **kwargs):
token = request.headers.get('Authorization')
if not token:
logger.error("token invalid")
return {'data': 'Token invalid'}, status.HTTP_401_UNAUTHORIZED
return f(*args, **kwargs)
return toValidate
在需要的route上添加验证修饰器:
@app.route("/users", methods=["GET"])
@request_token_validate
def query_models():
userList = []
# get user list
response_data = {"data": userList}
return response_data, status.HTTP_200_OK
来源:https://blog.csdn.net/alwaysrun/article/details/130789403
猜你喜欢
- 前言相信大家在网上经常看到有人秀出各种各样的字符画,对于这个五彩斑斓的世界来说,我们日常看到的都是一些高清的彩色的图片,偶尔来个粗糙的黑白的
- Tags# 普通for循环<ul>{% for user in user_list %} <li>{{
- 本文实例为大家分享了python傅里叶变换FFT绘制频谱图的具体代码,供大家参考,具体内容如下频谱图的横轴表示的是 频率, 纵轴表
- 1.保存变量先创建(在tf.Session()之前)saversaver = tf.train.Saver(tf.global_variab
- 一、pyc文件我们开发一个python脚本,文件的后缀为.py。如果运行这个py文件,Python内部会先将源码文件(.py文件)编译成字节
- 本文主要介绍了Python pandas 重命名索引和列名称的实现,分享给大家,具体如下:df=pd.DataFrame(np.arange
- 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。以下文章来源于数据STUDIO,作者龙哥
- Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的
- 前端实现用ligerUI实现分页,感觉用框架确实简单,闲着无聊,模拟着liger的分页界面实现了一遍(只要是功能,样式什么无视)
- 如果你的PHP网站换了空间,必定要对Mysql数据库进行转移,一般的转移的方法,是备份再还原,有点繁琐,而且由于数据库版本的不一样会导致数据
- arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维数组,注意得到的结果数组不包含终值。linsp
- 1. 简介有些时候在项目中,使用配置文件来配置一些灵活的参数是比较常见的事,因为这会使得代码的维护变得更方便。而ini配置文件是比较常用的一
- 原图代码 src = cv2.imread("28.png") gray_src = cv2.c
- Python 内置的 itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,我们可以通过 fo
- 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特
- 版本说明Python 3.0在设计的时候没有考虑向较早版本相容Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库
- 前言大家好,说起动态条形图,之前推荐过两个 Python 库,比如Bar Chart Race、Pandas_Alive,都可以实现。今天就
- CACHE_BACKEND参数每个缓存后端都可能使用参数。 它们在CACHE_BACKEND设置中以查询字符串形式给出。 有效参数如下:&n
- Python 异常处理的实例详解与许多面向对象语言一样,Python 具有异常处理,通过使用 try...except 块来实现。Note:
- <%@ transaction = required %><%response.b