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


猜你喜欢
- 秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影。秒杀的架构设计也是对于一个架构师架
- eval()函数eval() 函数用来执行一个字符串表达式,并返回表达式的值。语法eval(expression[, globals[, l
- 1. 原理孔洞指的是被前景像素点或者说感兴趣的像素点包围起来的区域,这个区域是我们不感兴趣的背景区域。数字图像处理的孔洞填充的公式为:I 为
- 本文实例讲述了Python模块结构与布局操作方法。分享给大家供大家参考,具体如下:#coding=utf8#起始行#!/usr/bin/en
- 本文实例讲述了Python爬虫框架Scrapy常用命令。分享给大家供大家参考,具体如下:在Scrapy中,工具命令分为两种,一种为全局命令,
- 如下所示:from win32com.client import constantsimport osimport win32com.cli
- 一、要求二、思路1.购物类buy接收 信用卡类 的信用卡可用可用余额,返回消费金额2.信用卡(ATM)类接收上次操作后,信用卡可用余额,总欠
- 目录它有什么作用?安装方法简介它有什么作用?它提供了一种将包括Python对象在内的结构化数据打包为JSON可序列化格式的机制。通过向相应的
- 1.单继承父类也叫基类子类也叫派生类如下所示,继承的关系:继承的书写格式:class 子类(父类):方法实例:class Animal: &
- Exec 是 os 包中的一个子包,它可用于使用 Go 运行外部命令。Go exec 命令教程展示了如何在 Golang 中执行 shell
- 今天终于可以用wxPython开发GUI程序了,非常高兴。把其中的一些注意点写下来以供参考。在windows XP平台下,首先需要做以下环境
- (asp.net的应用). 在网上一搜有很多此类文章,但我需要将公司的复杂的,较大的web应用也以此方式操作,比较的头大。一般的文章建议将b
- 1、确认mysql是否已安装,有下面的代码可知[root@cdh1 zjl]# yum list installed mysql*Loade
- 本文实例讲述了python中split方法用法。分享给大家供大家参考。具体分析如下:split 是非常重要的字符串方法,它是join的逆方法
- 每次装完系统之后都要重新安装一些软件,安装软件的时候又要上网查找安装的教程,比较麻烦,所以就自己整理了mysql-8.0.15-winx64
- 起由:前一阵子想要刷一刷国二Python的题库,千方百计找到题库之后,打开一个个word文档,发现一题一题阅读很麻烦,而且答案就在题目的下面
- 本文实例讲述了Python数据结构之双向链表的定义与使用方法。分享给大家供大家参考,具体如下:和单链表类似,只不过是增加了一个指向前面一个元
- 测试把txt文件导入至mysql数据库中: table: txt文件:D:/data.txt (txt文件下载)txt中使用 '\N
- 接口测试中,上传文件的测试场景非常常见。例如:上传头像(图片)、上传文件、上传视频等。下面以一个上传图片的例子为大家讲解如何通过 pytho
- 引入Gridgrid=Grid() # 可以分别调整上下左右的位置,可以是百分比,也可以是具体像素,如pos_top="50px&