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试试&#…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
