JWT认证实战
JWT(JSON Web Token)是一种轻量级的、基于 JSON 的开放标准(RFC 7519),用于在各方之间安全地传递信息。JWT 的特点是结构简单、轻量化和跨平台支持,适用于用户身份验证、信息加密以及无状态的 API 访问控制。使用 JWT,可以有效实现无状态的用户认证和授权,简化 Web 和 API 的身份管理流程。
一、JWT 的组成
JWT 由三部分组成,用 . 分隔:
- Header(头部):描述令牌类型和签名算法。
- Payload(负载):包含声明(Claims),如用户 ID、过期时间等。
- Signature(签名):用来验证信息的真实性。

示例 JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- Header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- Payload: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
- Signature: SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT 的应用场景
- 用户身份认证:前后端分离项目中,前端通过 JWT 验证用户身份。
- 授权:基于角色的访问控制。
- 信息传递:传递加密信息。
二、使用 JWT
使用 PyJWT 模块来生成和解析 JWT。安装方法如下:
pip install PyJWT
1. 基本用法
首先,我们来看下它的逻辑

生成 JWT
import jwt
import datetime# 密钥
SECRET_KEY = 'mysecretkey'# 创建 JWT
def create_token(data):payload = {"data": data,"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1) # 1小时后过期}token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")return token# 示例
token = create_token({"user_id": 123})print("Generated Token:", token)
解码 JWT
# 解码 JWT
def decode_token(token):try:payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])return payloadexcept jwt.ExpiredSignatureError:return "Token has expired"except jwt.InvalidTokenError:return "Invalid token"# 示例
decoded = decode_token(token)print("Decoded Payload:", decoded)
2. 添加更多字段到 Payload
# 创建带有角色信息的 JWT
def create_token_with_roles(data, roles):payload = {"data": data,"roles": roles,"iat": datetime.datetime.utcnow(), # 签发时间"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=2) # 过期时间}token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")return token# 示例
token_with_roles = create_token_with_roles({"user_id": 456}, ["admin", "editor"])print("Token with roles:", token_with_roles)# 解码并解析角色
decoded_with_roles = decode_token(token_with_roles)print("Decoded with roles:", decoded_with_roles)
3. 使用 Refresh Token 实现 Token 刷新
为了增强安全性,通常使用 Access Token 和 Refresh Token 的双令牌机制。
# 生成 Refresh Token
def create_refresh_token(data):payload = {"data": data,"exp": datetime.datetime.utcnow() + datetime.timedelta(days=7) # 7天后过期}refresh_token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")return refresh_token# 刷新 Access Token
def refresh_access_token(refresh_token):try:payload = jwt.decode(refresh_token, SECRET_KEY, algorithms=["HS256"])new_access_token = create_token(payload["data"])return new_access_tokenexcept jwt.ExpiredSignatureError:return "Refresh token has expired"except jwt.InvalidTokenError:return "Invalid refresh token"# 示例
refresh_token = create_refresh_token({"user_id": 123})print("Refresh Token:", refresh_token)new_access_token = refresh_access_token(refresh_token)print("New Access Token:", new_access_token)
4. 自定义异常处理
使用 JWT 时需要处理多种可能的异常。
# 自定义异常处理函数
def decode_token_with_exceptions(token):try:payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])return payloadexcept jwt.ExpiredSignatureError:raise Exception("Token expired. Please log in again.")except jwt.InvalidSignatureError:raise Exception("Invalid token signature. Token might be tampered.")except jwt.InvalidTokenError:raise Exception("Invalid token. Please provide a valid token.")# 示例
try:decoded_payload = decode_token_with_exceptions(token)print("Decoded:", decoded_payload)
except Exception as e:print("Error:", e)
5. 实战:在 Django 中使用 JWT
安装依赖
pip install djangorestframework-simplejwt
配置 SimpleJWT
在 Django 的 settings.py 中添加配置:
INSTALLED_APPS += ["rest_framework"]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}
添加视图
from rest_framework_simplejwt.views
import TokenObtainPairView, TokenRefreshView
urlpatterns = [
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
测试
- 获取 Token: POST 请求到 /api/token/,发送用户名和密码。
- 刷新 Token: POST 请求到 /api/token/refresh/,发送 refresh token。
三、注意事项
- 安全性:不要将敏感信息存储在 JWT 中。
- Token 过期策略:确保及时设置过期时间,防止长期有效的令牌带来的安全问题。
- 签名保护:使用安全的密钥存储和强加密算法。
相关文章:
JWT认证实战
JWT(JSON Web Token)是一种轻量级的、基于 JSON 的开放标准(RFC 7519),用于在各方之间安全地传递信息。JWT 的特点是结构简单、轻量化和跨平台支持,适用于用户身份验证、信息加密以及无状态的 API 访问控制…...
计算机网络 (23)IP层转发分组的过程
一、IP层的基本功能 IP层(Internet Protocol Layer)是网络通信模型中的关键层,属于OSI模型的第三层,即网络层。它负责在不同网络之间传输数据包,实现网络间的互联。IP层的主要功能包括寻址、路由、分段和重组、错误检测…...
权限管理的方法
模块化分类 功能模块划分 把人资管理系统按业务逻辑拆分成清晰的功能区,例如招聘管理、培训管理、绩效管理、员工档案管理等。招聘管理模块下还能细分职位发布、简历筛选、面试安排等子功能;员工档案管理涵盖基本信息、教育经历、工作履历录入与查询等。…...
【郑大主办、ACM出版、EI稳定检索】第四届密码学、网络安全与通信技术国际会议 (CNSCT 2025)
第四届密码学、网络安全与通信技术国际会议(CNSCT 2025)将于2025年1月17-19日在中国郑州盛大启幕(线上召开)。本次会议旨在汇聚全球密码学、网络安全与通信技术领域的顶尖学者、研究人员与行业领袖,共同探索计算机科学的最新进展与未来趋势。…...
48小时,搭建一个设备巡检报修系统
背景 时不时的,工地的设备又出了状况。巡检人员一顿懵逼、维修人员手忙脚乱,操作工人抱怨影响进度。老板看着待完成的订单,就差骂娘了:“这么搞下去,还能有效率吗?”。 于是,抱着试一试的心态…...
基于Redisson实现重入锁
一. 分布式锁基础 在分布式系统中,当多个客户端(应用实例)需要访问同一资源时,可以使用分布式锁来确保同一时刻只有一个客户端能访问该资源。Redis作为高性能的内存数据库,提供了基于键值对的分布式锁实现,…...
Java文件操作的简单示例
使用原生库 创建空白文件 package com.company; import java.io.File; import java.io.IOException;public class Main {public static void main(String[] args) {File f new File("newfile.txt");try {boolean flag f.createNewFile();System.out.println(&quo…...
删除与增加特定行
1.删除特定行 new_df <- df[-c(4), ] #删除第4行 new_df <- df[-c(2:4), ] #去除第2-4行 new_df <- subset(df, col1 < 10 & col2 < 6) #删除特定第一列<10和第二列<6的行。按名字删除 无论行列,可以找出对应索引或构造相同长…...
动态规划六——两个数组的dp问题
目录 题目一——1143. 最长公共子序列 - 力扣(LeetCode) 题目二——1035. 不相交的线 - 力扣(LeetCode) 题目三——115. 不同的子序列 - 力扣(LeetCode) 题目四—— 44. 通配符匹配 - 力扣(…...
项目优化之策略模式
目录 策略模式基本概念 策略模式的应用场景 实际项目中具体应用 项目背景: 策略模式解决方案: 计费模块策略模式简要代码 策略模式基本概念 策略模式(Strategy Pattern) 是一种行为型设计模式,把算法的使用放到环境类中,而算…...
[读书日志]从零开始学习Chisel 第四篇:Scala面向对象编程——操作符即方法(敏捷硬件开发语言Chisel与数字系统设计)
3.2操作符即方法 3.2.1操作符在Scala中的解释 在其它语言中,定义了一些基本的类型,但这些类型并不是我们在面向对象中所说的类。比如说1,这是一个int类型常量,但不能说它是int类型的对象。针对这些数据类型,存在一些…...
三子棋游戏
目录 1.创建项目 2.主函数编写 3.菜单函数编写 4.宏定义棋盘行和列 5.棋盘初始化 6.打印棋盘 7.玩家下棋 8.电脑下棋 9.平局判断 10.输赢判断 11.game函数 三子棋游戏(通过改变宏定义可以变成五子棋),玩家与电脑下棋 1.创建项目…...
MyBatis执行一条sql语句的流程(源码解析)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程(源码解析) MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…...
【电机控制】低通滤波器及系数配置
【电机控制】低通滤波器及系数配置 文章目录 [TOC](文章目录) 前言一、低通滤波器原理二、理论计算三、代码四、参考资料总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、低通滤波器原理 二、理论计算 三、代码 //低通滤波 pv->Ealpha…...
ArcgisServer过了元旦忽然用不了了?许可过期
昨天过完元旦之后上班发现好多ArcgisServer的站点运行出错了,点击日志发现,说是许可过去,也就是当时安装ArcgisServer时读取的ecp文件过期了,需要重新读取。 解决方法 1.临时方法,修改系统时间,早于2024年…...
如何在不丢失数据的情况下从 IOS 14 回滚到 IOS 13
您是否后悔在 iPhone、iPad 或 iPod touch 上安装 iOS 14?如果你这样做,你并不孤单。许多升级到 iOS 14 beta 的 iPhone、iPad 和 iPod touch 用户不再适应它。 如果您在正式发布日期之前升级到 iOS 14 以享受其功能,但您不再适应 iOS 14&am…...
【算法刷题】链表
文章目录 环形链表判断是否有环找出环的入口位置 双指针反转链表(Reverse a Linked List)移除链表中的指定元素(Remove Linked List Elements) 环形链表 判断是否有环 环形链表是指链表中的某些节点的 next 指针指向了链表中的某…...
计算机网络 —— 网络编程实操(1)(UDP)
计算机网络 —— 网络编程实操(UDP) 套接字端口套接字的定义为什么需要套接字? 套接字的分类1. 按照通信协议分类2. 按照地址族(Address Family)分类3. 按照通信模式分类 socket APIsockaddr结构 使用接口套接字初始化…...
selenium 确保页面完全加载
在使用Python和Selenium进行Web自动化时,确保页面完全加载是非常重要的。为了实现这一点,Selenium提供了两种主要类型的等待:显式等待(Explicit Waits)和隐式等待(Implicit Waits)。此外&#x…...
[极客大挑战 2019]HardSQL 1
看了大佬的wp,没用字典爆破,手动试出来的,屏蔽了常用的关键字,例如:order select union and 最搞的是,空格也有,这个空格后面让我看了好久,该在哪里加括号。 先传入1’ 1试试&#…...
用E4A中文安卓编程,手把手教你做一个能远程控制STM32的APP(基于OneNET MQTT)
用E4A中文安卓编程打造STM32远程控制APP:从零到上线的完整指南 在物联网项目开发中,硬件与移动端的无缝对接往往是开发者面临的一大挑战。传统Android开发需要掌握Java或Kotlin,这对嵌入式开发者来说门槛较高。E4A(易安卓…...
终极指南:3步让旧Mac焕发新生,OpenCore Legacy Patcher完整使用教程
终极指南:3步让旧Mac焕发新生,OpenCore Legacy Patcher完整使用教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为旧款Mac无法…...
Onekey:快速获取Steam游戏清单的终极免费工具完全指南
Onekey:快速获取Steam游戏清单的终极免费工具完全指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 对于Steam游戏玩家和开发者来说,获取游戏的Depot清单文件一直是个技…...
如何高效使用NVIDIA Profile Inspector:5分钟掌握显卡隐藏性能优化技巧
如何高效使用NVIDIA Profile Inspector:5分钟掌握显卡隐藏性能优化技巧 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业的显卡配置文件编辑工具…...
ViTables终极指南:快速掌握HDF5数据可视化与分析神器
ViTables终极指南:快速掌握HDF5数据可视化与分析神器 【免费下载链接】ViTables ViTables, a GUI for PyTables 项目地址: https://gitcode.com/gh_mirrors/vi/ViTables 想要高效管理和分析海量科学数据?面对复杂的HDF5文件结构感到无从下手&…...
3个步骤让你的Windows系统重获新生:Winhance中文版完全指南
3个步骤让你的Windows系统重获新生:Winhance中文版完全指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhan…...
如何快速制作专业级LRC歌词:免费开源工具歌词滚动姬终极指南
如何快速制作专业级LRC歌词:免费开源工具歌词滚动姬终极指南 【免费下载链接】lrc-maker 歌词滚动姬|可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 制作精准同步的LRC歌词文件,是每…...
手把手教你配置STM32的QSPI外设:以读写W25Q256JV Flash为例(含完整代码)
STM32 QSPI外设深度实战:W25Q256JV Flash高速存储全解析 第一次接触STM32的QSPI外设时,我被官方手册里密密麻麻的寄存器描述弄得晕头转向。直到在真实项目中用它驱动W25Q256JV Flash芯片,才真正理解这个外设的精妙之处——它不仅仅是SPI的&qu…...
【代码质量守门员升级计划】:为什么91%的团队在第3周就弃用Copilot审查插件?这4个未公开的规则引擎配置才是关键
第一章:智能代码生成与代码审查自动化的演进脉络 2026奇点智能技术大会(https://ml-summit.org) 智能代码生成与代码审查自动化并非一蹴而就的技术跃迁,而是伴随编译器理论、静态分析、程序合成与大语言模型三重范式演进的协同产物。早期以Lint工具和C…...
语音合成技术实践
语音合成技术实践:让机器开口说话 在人工智能飞速发展的今天,语音合成技术(TTS)已成为人机交互的重要桥梁。从智能助手的有声应答到影视配音的自动化处理,合成语音正逐渐融入日常生活。这项技术通过算法模拟人类发声&…...
