Python JWT认证与pyjwt包详细介绍

 更新时间:2023年05月23日 14:29:41   作者:alwaysrun  
JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密,这篇文章主要介绍了Python JWT认证与pyjwt包简介,需要的朋友可以参考下

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包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python中数据库like模糊查询方式

    python中数据库like模糊查询方式

    这篇文章主要介绍了python中数据库like模糊查询方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 导入pytorch时libmkl_intel_lp64.so找不到问题解决

    导入pytorch时libmkl_intel_lp64.so找不到问题解决

    这篇文章主要为大家介绍了导入pytorch时libmkl_intel_lp64.so找不到问题解决示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • python计算RPKM操作示例详解

    python计算RPKM操作示例详解

    这篇文章主要为大家介绍了python计算RPKM操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • python使用Plotly绘图工具绘制水平条形图

    python使用Plotly绘图工具绘制水平条形图

    这篇文章主要为大家详细介绍了python使用Plotly绘图工具绘制水平条形图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • python数据类型可变与不可变深入分析

    python数据类型可变与不可变深入分析

    这篇文章主要为大家介绍了python数据类型可变与不可变深入分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 在pycharm上mongodb配置及可视化设置方法

    在pycharm上mongodb配置及可视化设置方法

    今天小编就为大家分享一篇在pycharm上mongodb配置及可视化设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • OpenCV结合selenium实现滑块验证码

    OpenCV结合selenium实现滑块验证码

    本文主要介绍了OpenCV结合selenium实现滑块验证码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • pygame实现井字棋之第一步绘制九宫格

    pygame实现井字棋之第一步绘制九宫格

    这篇文章主要介绍了pygame实现井字棋之第一步绘制九宫格,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • 利用Python进行异常值分析实例代码

    利用Python进行异常值分析实例代码

    数据挖掘工作中的第一步就是异常值检测,异常值的存在会影响实验结果。下面这篇文章主要给大家介绍了关于利用Python进行异常值分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • 如何利用Fabric自动化你的任务

    如何利用Fabric自动化你的任务

    大家都知道Fabric是一个Python库,可以通过SSH在多个host上批量执行任务。你可以编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行。这些功能非常适合应用的自动化部署,或者执行系统管理任务。本文将介绍如何利用Fabric自动化你的任务。
    2016-10-10

最新评论