django应用JWT(JSON Web Token)实战

文章目录
    • 一、什么是JWT
    • 二、为什么使用JWT
    • 三、在django项目中如何应用JWT
      • 1、安装djangorestframework-simplejwt库:
      • 2、在settings.py中配置JWT认证:
      • 3、在urls.py中配置JWT的获取和刷新路由:
    • 四、JWT如何使用
      • 1、调用生成JWT的接口获取JWT
      • 2、客户端保存JWT在调用接口时带上获取的JWT

在前后端分离的项目中,前后端进行身份验证通常用JWT来进行,JWT 提供了一个理想的认证解决方案,用来保护 RESTful API,确保只有经过认证的用户才能访问受保护的资源。基于前端框架(如React, Angular, Vue.js)的单页面应用 (SPA),开发者通过使用 JWT可以获得一种简单、安全、高效的方式来处理用户认证和授权的问题。本文通过django项目的实战来说明如何应用和使用JWT。

一、什么是JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络各方之间以安全且紧凑的形式传输信息。JWT 是一个小型的凭证,通常用于身份验证和授权场景。JWT 由三部分组成:头部 (Header)、负载 (Payload) 和签名 (Signature)。
JWT信息由3段构成,它们之间用圆点“.”连接,格式如下:

aaaaaa.bbbbbb.cccccc

一个典型的JWT如下所示:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI2OTcyMDc2LCJpYXQiOjE3MjY5NzAyNzYsImp0aSI6IjMyMTFiZjdmZDlhZTRmNTBhMDNmOGM2NjcwNDM2NjFiIiwidXNlcl9pZCI6Mn0.Ej6US4Uk-sSNm9P8kTU_cDAzBpO4I-BLhPstp5sG00Q
  • 头部 (Header):包含了关于 JWT 类型的信息以及所使用的签名算法。
  • 负载 (Payload):是 JWT 的主体部分,包含了实际需要声明的数据。这些数据通常包括用户ID、用户名、角色等信息。
  • 签名 (Signature):用于验证 JWT 的发送者就是它声称的发送者,同时也确保了 JWT 在传输过程中没有被篡改。

二、为什么使用JWT

使用 JWT 的原因主要有以下几点:

  • 安全性:JWT 通过签名来保证数据的完整性和防篡改性。如果有人试图修改 JWT 内容,签名会失效,接收方可以检测到这一行为。
  • 无状态性:JWT 是自包含的,这意味着不需要在服务器上保存会话状态。每个 JWT 都包含了所有必要的信息,从而减少了对服务器端存储的需求。
  • 跨域支持:JWT 可以轻松地在不同的域之间共享,这使得它非常适合微服务架构和分布式系统。
  • 性能提升:由于 JWT 是自包含的,所以服务器可以快速地验证 JWT,而无需查询数据库来获取用户信息,这提高了应用的响应速度。
  • 易于缓存和扩展:JWT 可以被缓存,并且因为它们是无状态的,所以可以很容易地扩展到多个服务器,而无需担心会话复制问题。
  • CSRF 防护:使用 JWT 可以帮助缓解跨站请求伪造(CSRF)攻击的风险,因为 JWT 不依赖于 cookie,也就不会随同 HTTP 请求自动发送。

总的来说,JWT 提供了一种高效、安全的方式来处理用户认证和授权,尤其是在需要跨域操作或构建无状态服务的情况下。

三、在django项目中如何应用JWT

JWT(JSON Web Token)是一种用于在网络应用中安全地传输信息的令牌。它通常用于身份验证和授权,特别是在单页应用(SPA)和API服务中。在Django中应用JWT,可以使用 djangorestframework-simplejwt。

1、安装djangorestframework-simplejwt库:
pip install djangorestframework-simplejwt
2、在settings.py中配置JWT认证:

在INSTALLED_APPS中添加rest_framework_simplejwt的应用

INSTALLED_APPS = [
    'blog',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'rest_framework_simplejwt',  # 添加 simplejwt 应用
    'django_filters',  # 注册条件查询
    'mdeditor',  # 注册markdown的应用
    'drf_yasg2',  # 接口文档
]

添加REST_FRAMEWORK的默认认证类为JWT认证

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
}

添加SIMPLE_JWT的相关配置

# JWT 相关设置
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),  # 访问令牌的有效时间
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),  # 刷新令牌的有效时间
    'ROTATE_REFRESH_TOKENS': False,  # 是否允许刷新令牌循环
    'BLACKLIST_AFTER_ROTATION': True,  # 刷新令牌后是否加入黑名单
    'UPDATE_LAST_LOGIN': False,  # 登录时是否更新最后登录时间

    'ALGORITHM': 'HS256',  # 签名算法
    'SIGNING_KEY': SECRET_KEY,  # 签名密钥
    'VERIFYING_KEY': None,  # 验证密钥
    'AUDIENCE': None,  # 观众
    'ISSUER': None,  # 发行人
    'JWK_URL': None,  # JWK URL
    'LEEWAY': 0,  # 宽限期

    'AUTH_HEADER_TYPES': ('Bearer',),  # 授权头类型
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',  # 授权头名称
    'USER_ID_FIELD': 'id',  # 用户 ID 字段
    'USER_ID_CLAIM': 'user_id',  # 用户 ID 声明
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),  # 认证令牌类
    'TOKEN_TYPE_CLAIM': 'token_type',  # 令牌类型声明
    'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',  # 滑动令牌刷新过期声明
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),  # 滑动令牌有效时间
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),  # 滑动令牌刷新有效时间
}
3、在urls.py中配置JWT的获取和刷新路由:
from django.urls import path
from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView)
urlpatterns = [
    path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    # 其他路由...
]

4、在视图中需要认证的地方使用JWT认证
如下modelviweset中使用,对于查询方法如list,retrieve不做鉴权,对于其他方法需要鉴权。

def get_permissions(self):
    """
    Instantiates and returns the list of permissions that this view requires.
    """
    if self.action in ['list', 'retrieve']:
        # 对于list方法,返回AllowAny权限类,表示不需要鉴权
        permission_classes = [AllowAny, ]
    else:
        # 对于其他方法,返回IsAuthenticated权限类,表示需要用户已认证
        permission_classes = [IsAuthenticated, ]
    return [permission() for permission in permission_classes]

四、JWT如何使用

通过上面的应用后,使用接口调用遇到需要鉴权的会提示需要认证。
如当我们调用删除接口时,如果没有获得鉴权,接口会返回需要认证的信息。
在这里插入图片描述

那如何通过JWT进行认证呢?
JWT进行认证过程

下面通过postman来应用JWT的使用过程。

1、调用生成JWT的接口获取JWT

在这里插入图片描述

2、客户端保存JWT在调用接口时带上获取的JWT

在这里插入图片描述

至此,本文介绍了什么时JWT,为什么要使用JWT,通过django实现JWT,介绍了JWT的使用流程,最后以一个具体API接口实例的调用来说明JWT如何使用。后续将介绍VUE从前端登录获取JWT到JWT认证的实例。


博客地址:http://xiejava.ishareread.com/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆,用以运送各种汽油、柴油、原油等油品,运输危险系数大,而且由于油罐车需要经常行驶在城区道路,为城市各个加油站点、企业工厂运输补充所需油料,因此也是危化品运输车辆的重点监测和管控对象…

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值: 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析,中国,李宗璋用EXCEL学统计学,日EXCEL统计分析与决策&#x…

知行之桥EDI系统V2024 12月9111版本更新

知行之桥EDI系统V2024于12月推出版本更新(版本号:9111),在原有产品的基础上进行了一系列的新增、更改和修复,以确保 EDI 和 MFT 集成尽可能的简单化。 主要特性 新增 新增EDI 交易伙伴管理控制台 交易伙伴管理控制台…

PDF 文件如何转为 CAD 图纸?PDF2CAD 使用教程

在工程设计和建筑行业中,PDF 文件常常被用来分享和存档图纸。然而,当需要对这些图纸进行编辑或进一步开发时,静态的 PDF 格式就显得力不从心了。这时候,将 PDF 文件转换为可编辑的 CAD(计算机辅助设计)格式…

JAVA守护线程和本地线程的区别?

大家好,我是锋哥。今天分享关于【JAVA守护线程和本地线程的区别?】面试题。希望对大家有帮助; JAVA守护线程和本地线程的区别? 在 Java 中,守护线程(Daemon Thread)和本地线程(User…

SpringBoot中集成常见邮箱中容易出现的问题

本来也没打算想写得。不过也是遇到一些坑&#xff0c;就记录一下吧&#xff0c;也折腾了小半天 1.maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>2…

数据分析与可视化:用 Python 处理、分析与展示数据

数据分析与可视化&#xff1a;用 Python 处理、分析与展示数据 Python 在数据分析领域有着非常强大的生态和灵活性&#xff0c;从数据清洗、处理&#xff0c;到分析、可视化&#xff0c;它几乎无所不能。今天&#xff0c;我们一起来聊聊如何用 Python 处理、分析和展示数据&…

Chrome浏览器调用ActiveX控件--allWebOffice控件

背景 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功能&#xff0c;…

ESXI6.7开启SSH密码通过Xshell登录

背景 近期服务器安装了ESXI6.7&#xff0c;想通过SSH到终端把/var/log/下的所有日志文件下载下来 解决方案 1、esxi开启ssh登录 2、选择Troubleshooting Options 3、开启SSH 4、打开ESXi的web页面&#xff0c;设置开启shell 5、使用Xshell连接&#xff0c;方法一定要勾选Keybo…

Vue宏观理解

文章目录 1 Vue是什么2 前端运行环境和工具3 环境搭建3.1 node.js安装3.2 Vite环境安装 4 Vue项目开发4.1 Vue项目开发开发方式4.2 Vue项目结构4.3 启动Vue项目4.4 Vue开发4.4 Vue工程运行流程 1 Vue是什么 Vue是一款Web前端JavaScript 框架&#xff1b; 官网&#xff1a;http…

Redis安装和Python练习(Windows11 + Python3.X + Pycharm社区版)

环境 Windows11 Python3.X Pycharm社区版 思路 1 github下载redis压缩包 &#xff0c;安装并启动redis服务&#xff0c;在客户端连接redis服务。 2 在pycharm中运行python程序&#xff0c;连接redis服务&#xff0c;熟悉redis的使用和巩固python语言。 3 python开发环境…

Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值

MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB&#xff0c;我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上&#xff0c;包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户&#xff0c…

蓝桥杯历届真题 --#递推 翻硬币(C++)

文章目录 思路完整代码结语 原题链接 思路 通过观察测试用例&#xff0c;我们猜测&#xff0c;从左到右依次对比每一个位置上的状态&#xff0c;如果不一样我们就翻一次&#xff0c;最终得到的答案即为正解。 完整代码 //这里是引入了一些常用的头文件,和一些常规操作 //第一…

vs配置c++标准

在 vcxproj 文件中添加 <LanguageStandard>stdcpp17</LanguageStandard> 和在 Visual Studio 属性页面中设置 “C语言标准” 为 “ISO C17 标准 (/std:c17)” 是完全等价的。 它们的对应关系是&#xff1a; VS属性页面中的设置&#xff1a; 项目 -> 属性 ->…

机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法

引言 大模型&#xff08;如BERT、GPT等&#xff09;在自然语言处理任务中展现了强大的能力&#xff0c;但为了使其更贴合特定应用场景&#xff0c;通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据&#xff0c;并通过具体…

R学习——因子

目录 1 定义因子&#xff08;factor函数&#xff09; 2因子的作用 一个数据集中的 只需要考虑可以用哪个数据来进行分类就可以了&#xff0c;可以用来分类就可以作为因子。 Cy1这个因子对应的水平level是4 6 8&#xff1a; 1 定义因子&#xff08;factor函数&#xff09; 要…

计算机毕设-基于springboot的口腔诊所系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

【ComfyUI+视频生成】LTX-Video 快速生成视频 + 图生视频 (生成4秒 3090需要20秒)

代码&#xff1a;https://github.com/Lightricks/LTX-Video comfyui官方工作流&#xff1a;https://comfyanonymous.github.io/ComfyUI_examples/ltxv/ 官方模型&#xff1a;https://huggingface.co/Lightricks/LTX-Video 工作流下载&#xff1a;https://pan.baidu.com/s/1g9Y…

axios的引入和基本使用

一、axios的引入 使用 pnpm add axios 二、使用axios 三、axios的使用方法补充 axios除了直接使用它实例上的方法&#xff0c;还可以通过配置的方式进行使用axios({})&#xff0c;传入一个对象&#xff0c;这个对象可以有如下属性&#xff1a; url&#xff08;字符串&#…

【蓝桥杯最新板】蓝桥杯嵌入式液晶上实现电子时钟

这几年蓝桥杯比赛比较适合学生技能学习&#xff0c;考虑板子功能&#xff0c;提出完成的任务。 要求在液晶完成如下图效果&#xff1a; 主要是实现液晶显示时钟和数字时钟&#xff0c;具体样式可以依据实际情况微调。 实现过程&#xff1a; 1.需要画圆&#xff08;外圆、内圆…