Python JWT认证与pyjwt包详细介绍
作者:alwaysrun
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
到此这篇关于Python JWT认证与pyjwt包简介的文章就介绍到这了,更多相关JWT认证与pyjwt包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!