[Python]JWT认证与pyjwt包简介

news/2024/11/19 19:34:18/

文章目录

    • JWT认证简介
      • 构成
      • 载荷声明
    • pyjwt
      • 编解码
      • flask中验证

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 jwtJWT_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 jwtTokendef 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 Falsereturn data == payloadexcept 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 wrapsdef 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_UNAUTHORIZEDreturn f(*args, **kwargs)return toValidate

在需要的route上添加验证修饰器:

@app.route("/users", methods=["GET"])
@request_token_validate
def query_models():userList = []# get user listresponse_data = {"data": userList}return response_data, status.HTTP_200_OK

http://www.ppmy.cn/news/75537.html

相关文章

Python 中的函数微分是如何实现的?

1. 如何编写计算函数微分的代码?举个简单例子 可以使用 PyTorch 中的自动微分功能来计算函数的导数。下面是一个简单的例子: import torch# 定义一个需要求导的函数 def f(x):return x ** 2 2 * x 1# 创建一个张量,并设置 requires_gradT…

第一个SpringBoot程序

如何创建一个SpringBoot项目,两种方式,官网或IDEA 官方提供了一个快速生成的网站,IDE集成了这个网站 spring官网 Spring | Homehttps://spring.io/进入spring官网,点击projects,点击SpringBoot,进到如下…

kicad学习笔记6:kicad启动及其grid参数设置和修改

1。kicad启动&#xff1a; single_top.cpp 启动函数&#xff1a; 1。 IMPLEMENT_APP( APP_SINGLE_TOP )2。 PGM_SINGLE_TOP::OnPgmInit()3。 PGM_BASE::InitPgm2。kicad参数 grid参数定义&#xff1a; struct GRID_SETTINGS {bool axes_enabled;std::vector<wxString&…

实时频谱-2.4窗口函数

窗口函数 在离散傅立叶变换(DFT)分析运算中&#xff0c;一个固有的假设是要处理的数据是单个周期定期重复的信号。例如&#xff0c;在图2-8中的帧2上应用DFT处理时&#xff0c;信号上会进行周期性扩展。 在连续的帧之间一般会发生不连续点&#xff0c;如图 2-9 所示。 这些人…

【PaperReading】Heterogeneous Graph Neural Network

Heterogeneous Graph Neural Network 1. 引言2. 问题定义2.1 内容关联异质图(Content-associated Heterogeneous Graphs)2.2 异质图表示学习(Heterogeneous Graph Representation Learning)3. HetGNN3.1 采样异质邻居节点(C1)3.2 编码异质的内容信息(C2)1 预训练分别得到不…

pg事务:multixact

什么是multixact&#xff1f; 在对同一行加锁时&#xff0c;元组上关联的事务ID可能有多个&#xff0c;pg将多个事务ID组合起来用一个MultiXactID来管理。TransactionId和MultiXactID是多对一的关系 multixactID跟TransactionId一样&#xff0c;也是32位&#xff0c;同样有wra…

Learn Git Branching 记录

Learning Git Branching 可以说是目前为止最好的教程了&#xff0c;地址 点击右下角问号显示常用命令 1.提交 git commit提交内容&#xff0c;并把这些修改保存成了一个提交记录 C3&#xff0c;C3 的父节点是 C2 修改提交信息 git commit --amend每次 git commit 后都会产生一…

前端也学学有符号数和无符号数

目录 前言什么是有符号数&#xff1a;什么是无符号数&#xff1a;无符号数和有符号数转换&#xff1a; 前言 今天来学习一下什么是有符号整数和无符号整数之间的转换&#xff0c;并且和十进制数之间的转换。 主要分为两点&#xff1a; 1、大致了解一下什么有符号整数&#xff…