【Python】PyJWT:轻松实现 JSON Web Token (JWT) 网络令牌的生成与验证

点关注开车不迷路

PyJWT 是一个用 Python 实现的轻量级库,用于处理 JSON Web Token (JWT)。JWT 是一种安全的方式,用来表示双方之间经过签名的令牌,通常用于认证和授权场景。PyJWT 简化了 JWT 的生成和验证过程,使得开发者能够轻松地在 Python 项目中集成 JWT 功能。

在这篇博客中,我们将深入介绍 PyJWT,展示如何生成、解码和验证 JWT 令牌,并且会通过代码示例演示如何在实际项目中使用 PyJWT 进行认证和授权。

在这里插入图片描述

华丽的分割线

➰缘起

    • 💯 什么是 JWT?
      • 为什么选择 PyJWT?
    • 💯 安装 PyJWT
    • 💯 PyJWT 的基本用法
      • 1. 生成 JWT 令牌
      • 2. 解码 JWT 令牌
      • 3. 验证 JWT 令牌
    • 💯 PyJWT 支持的签名算法
      • 1. 使用 RS256 生成 JWT 令牌
      • 2. 使用公钥验证 JWT 令牌
    • 💯 PyJWT 在 Web 应用中的实际应用
      • 1. 使用 PyJWT 进行用户认证
    • 💯 常见配置和选项汇总表
    • 📥 下载地址
    • 💬 结语
      • 📒 参考文献


标题1

💯 什么是 JWT?

JWT 是一种将认证信息或用户信息以 JSON 格式进行编码并加密的令牌。JWT 令牌通常由三部分组成:

  • Header(头部):声明令牌的类型和签名算法。
  • Payload(负载):存储用户信息或其他数据。
  • Signature(签名):对前两部分进行签名,以确保数据的完整性和安全性。

一个典型的 JWT 结构如下:

Header.Payload.Signature

为什么选择 PyJWT?

  1. 轻量且易于使用:PyJWT 非常简洁,提供了简单的接口来生成和验证 JWT。
  2. 支持多种算法:PyJWT 支持多种签名算法,包括 HMAC 和 RSA,使得开发者可以根据需求选择合适的加密方式。
  3. 集成简单:无论是 Web 项目还是 API 服务,PyJWT 都可以轻松与 Python 的 Flask、Django 等框架集成。

标题2

💯 安装 PyJWT

要在项目中使用 PyJWT,可以通过 pip 进行安装:

pip install pyjwt

安装完成后,即可在你的 Python 项目中使用 PyJWT 进行令牌的生成和验证。


标题3

💯 PyJWT 的基本用法

1. 生成 JWT 令牌

使用 PyJWT,生成 JWT 令牌非常简单。你只需要定义一个 payload(即令牌中包含的信息),然后使用 jwt.encode() 方法对其进行签名。

import jwt
import datetime# 定义一个 payload
payload = {"user_id": 123,"username": "test_user","exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=30)  # 令牌有效期为 30 分钟
}# 使用密钥进行签名
secret = 'my_secret_key'# 生成 JWT
token = jwt.encode(payload, secret, algorithm='HS256')print(f"生成的 JWT 令牌:{token}")

在这个示例中,我们定义了一个包含用户 ID 和用户名的 payload,并且设置了令牌的过期时间为 30 分钟。jwt.encode() 会使用 HMAC-SHA256 算法对 payload 进行签名,生成最终的 JWT 令牌。

2. 解码 JWT 令牌

一旦生成了 JWT 令牌,在验证时我们可以使用 jwt.decode() 方法来解码令牌,并提取其中的 payload 数据。

# 解码 JWT
decoded_payload = jwt.decode(token, secret, algorithms=['HS256'])print(f"解码后的 payload:{decoded_payload}")

通过解码,我们可以获得令牌中存储的用户信息或其他数据。

3. 验证 JWT 令牌

JWT 令牌通常用于认证系统中,因此在解码时,我们需要确保令牌的签名和内容是有效的。如果签名不匹配,或令牌已过期,解码将失败并抛出异常。

try:# 验证并解码 JWTdecoded_payload = jwt.decode(token, secret, algorithms=['HS256'])print(f"有效的令牌,payload:{decoded_payload}")
except jwt.ExpiredSignatureError:print("令牌已过期")
except jwt.InvalidTokenError:print("无效的令牌")

在这个示例中,我们使用 try-except 块来处理令牌的有效性。如果令牌已过期或签名无效,PyJWT 会抛出相应的异常。


标题4

💯 PyJWT 支持的签名算法

PyJWT 支持多种签名算法,常见的有:

  • HS256:基于 HMAC 和 SHA256 的对称加密算法。
  • RS256:基于 RSA 的非对称加密算法。

以下是使用 RSA 私钥和公钥进行签名和验证的示例:

1. 使用 RS256 生成 JWT 令牌

# 加载私钥
with open('private.pem', 'r') as f:private_key = f.read()# 生成 JWT
token = jwt.encode(payload, private_key, algorithm='RS256')

2. 使用公钥验证 JWT 令牌

# 加载公钥
with open('public.pem', 'r') as f:public_key = f.read()try:# 使用公钥验证令牌decoded_payload = jwt.decode(token, public_key, algorithms=['RS256'])print(f"有效的令牌,payload:{decoded_payload}")
except jwt.InvalidTokenError:print("无效的令牌")

标题5

💯 PyJWT 在 Web 应用中的实际应用

PyJWT 非常适合用于 Web 应用中的身份认证和授权。以下是如何在 Flask 中使用 PyJWT 来保护 API 接口的示例。

1. 使用 PyJWT 进行用户认证

from flask import Flask, request, jsonify
import jwt
import datetimeapp = Flask(__name__)
secret = 'my_secret_key'# 用户登录接口
@app.route('/login', methods=['POST'])
def login():username = request.json.get('username')password = request.json.get('password')# 假设验证用户名和密码成功if username == 'test_user' and password == 'password123':payload = {"user_id": 123,"username": username,"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=30)}token = jwt.encode(payload, secret, algorithm='HS256')return jsonify({"token": token})else:return jsonify({"message": "Invalid credentials"}), 401# 受保护的 API 接口
@app.route('/protected', methods=['GET'])
def protected():token = request.headers.get('Authorization').split()[1]try:decoded_payload = jwt.decode(token, secret, algorithms=['HS256'])return jsonify({"message": f"Hello, {decoded_payload['username']}!"})except jwt.ExpiredSignatureError:return jsonify({"message": "Token has expired"}), 401except jwt.InvalidTokenError:return jsonify({"message": "Invalid token"}), 401if __name__ == '__main__':app.run(debug=True)

在这个示例中,我们创建了两个接口:

  • /login:用户登录接口,成功登录后返回一个 JWT 令牌。
  • /protected:受保护的接口,只有在提供有效 JWT 令牌时才能访问。

标题6

💯 常见配置和选项汇总表

选项功能描述示例
algorithms指定签名算法algorithms=['HS256']
jwt.encode()生成 JWT 令牌jwt.encode(payload, secret, algorithm='HS256')
jwt.decode()解码并验证 JWT 令牌jwt.decode(token, secret, algorithms=['HS256'])
jwt.ExpiredSignatureError捕获令牌过期异常except jwt.ExpiredSignatureError
jwt.InvalidTokenError捕获无效令牌异常except jwt.InvalidTokenError

标题7

📥 下载地址


PyJWT 最新版 下载地址


标题8

💬 结语

PyJWT 是一个非常轻量级且功能强大的库,它为 Python 开发者提供了便捷的 JWT 生成和验证功能。通过本文的示例,你可以快速上手使用 PyJWT 并将其集成到你的认证系统中。无论是基于对称加密的 HMAC,还是基于非对称加密的 RSA,PyJWT 都能轻松应对。同时,PyJWT 的简单接口和易于扩展的特性,使得它成为 Web 应用中实现认证和授权的理想工具。

📒 参考文献

  • PyJWT 官方文档
  • PyJWT GitHub仓库

剩蛋快乐


愿者上钩

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/434704.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第443题压缩字符串

题目&#xff1a; 题解&#xff1a; class Solution:def compress(self, chars: List[str]) -> int:def reverse(left: int, right: int) -> None:while left < right:chars[left], chars[right] chars[right], chars[left]left 1right - 1n len(chars)write lef…

基于php摄影门户网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Verilog:实例数组(重复实例化的快捷方法)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 前言 谈到重复实例化&#xff0c;一般都会想到for generate结构&#xff0c;但其实有一种更加简单的语法&#xff0c;只是使用的人不多&#xff0c;它就是实例数…

JavaScript 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)

先决条件&#xff1a; 如何检查两个给定的线段是否相交&#xff1f; c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspnet/article/details/141713762 python https://blog.csdn.net/hefeng_aspnet/article/details/…

智能监控,守护绿色能源:EasyCVR在电站视频监控中心的一站式解决方案

随着科技的飞速发展&#xff0c;视频监控技术在社会安全、企业管理及智慧城市建设等领域中扮演着越来越重要的角色。特别是在电力行业中&#xff0c;电站作为能源供应的关键设施&#xff0c;其安全性和稳定性至关重要。传统的人工监控方式已难以满足现代电站复杂多变的运行需求…

基于SpringBoot+Vue+MySQL的甜品店管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化浪潮的推动下&#xff0c;甜品店行业也面临着转型与升级的需求。传统的线下经营模式已难以满足现代消费者对于便捷、高效购物体验的追求。为了提升运营效率、优化顾客体验&#xff0c;我们设计了一款基于SpringBoot后端…

Ubuntu 16.04安装填坑记录

一. 问题描述&#xff1a; &#xff08;1&#xff09;Ubuntu 16.04使用USB启动盘安装时&#xff0c;出现"try ubuntu without installation"或“install ubuntu”选择&#xff0c;Enter选择安装后&#xff0c;显示器黑屏无任何显示。 原因分析&#xff1a; 显示黑…

遥感图像变换检测实践上手(TensorRT+UNet)

目录 简介 分析PyTorch示例 onnx模型转engine 编写TensorRT推理代码 main.cpp测试代码 小结 简介 这里通过TensorRTUNet&#xff0c;在Linux下实现对遥感图像的变化检测&#xff0c;示例如下&#xff1a; 可以先拉去代码&#xff1a;RemoteChangeDetection 分析PyTorch示…

网络攻击DDOoS的原理、攻击手段及防范措施详解

一、DDoS的原理 1. 原理 DDoS&#xff08;分布式拒绝服务攻击&#xff09;是利用大量的僵尸主机对受害者发起攻击&#xff0c;从而造成受害者的资源被耗尽无法为合法用户提供服务。DDoS一般采用三级结构&#xff0c;包括&#xff1a; 攻击者&#xff1a;攻击指令的发起方僵尸…

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库 一、环境说明二、分布式键值数据库介绍三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、分布式键值数据库介绍 KVStore简介&#xff1a; 分布式键值数据库…

OpenHarmony(鸿蒙南向)——平台驱动指南【DAC】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DAC&#xff08;Digital to Analog Converter&…

Python办公自动化之Word

在现代办公环境中&#xff0c;自动化无疑是提升工作效率的关键。特别是处理文档的工作&#xff0c;很多人可能花费大量时间在重复性任务上。那么&#xff0c;有没有一种方法可以让我们用 Python 来自动化 Word 文档的操作呢&#xff1f;今天&#xff0c;我们来聊聊如何用 Pytho…

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system&#xff1a; Agent学会调用外部应用程序接口&#xff0c;以获取模型权重中缺失的额外信息&#xff08;预训练后通常难以更改&#xff09;&#xff0c;包括当前信息、代码执行能力、专有信息源…

Docker安装与应用

前言 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻 量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互 之间…

大语言模型之LlaMA系列- LlaMA 2及LLaMA2_chat(上)

LlaMA 2是一个经过预训练与微调的基于自回归的transformer的LLMs&#xff0c;参数从7B至70B。同期推出的Llama 2-Chat是Llama 2专门为对话领域微调的模型。 在许多开放的基准测试中Llama 2-Chat优于其他开源的聊天模型&#xff0c;此外Llama 2-Chat还做了可用性与安全性评估。 …

物联网系统中基于IIC通信的数字温度传感器测温方案

01 物联网系统中为什么要使用数字式温度传感器芯片 物联网系统中使用数字式温度传感器芯片的原因主要有以下几点&#xff1a; 高精度与稳定性 高精度测量&#xff1a;数字式温度传感器芯片&#xff0c;如DS18B20&#xff0c;采用芯片集成技术&#xff0c;能够有效抑制外界不…

2024-9-28 QT登录框基础练习

1.头文件 #ifndef LOGINWINDOW_H #define LOGINWINDOW_H#include <QWidget> #include <QPushButton> #include <QLineEdit> #include <QVBoxLayout>class LoginWindow : public QWidget {Q_OBJECTpublic:// 构造函数LoginWindow(QWidget *parent nul…

打造备份一体机,群晖科技平台化战略再进阶

数字经济时代&#xff0c;海量数据不断涌现&#xff0c;并成为核心生产要素&#xff0c;驱动着企业生产方式和商业模式发生深刻变革。 与其他生产要素不同&#xff0c;数据要素具有非稀缺性、非竞争性等特征&#xff0c;且只有在具体业务场景中才能充分释放其价值。尤其是近年…

Element-Plus中上传文件upload取消提示按钮与文字

去除提示按钮与文字 添加样式&#xff0c;让这个div进行隐藏 .el-upload__input {display: none !important; }

物联网系统中高精度压力检测方案_压力变送器

01 物联网系统中为什么要使用压力变送器 在物联网系统中使用压力变送器的原因主要基于以下几个方面&#xff1a; 感知层的核心作用 物联网系统主要由感知层、传输层、平台层和应用层组成。感知层作为物联网的“排头兵”&#xff0c;负责收集物理世界中的各种信息。压力变送…