Django笔记(七):JWT认证

前后端分离的项目更多使用JWT认证——Json Web Token。本文记录djangorestframework-simplejwt的使用方式。文档

安装

pip install djangorestframework-simplejwt

配置settings.py:

INSTALLED_APPS = ['rest_framework_simplejwt',
]REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework_simplejwt.authentication.JWTAuthentication',)
}from datetime import timedeltaSIMPLE_JWT = {"ACCESS_TOKEN_LIFETIME": timedelta(minutes=5), # access有效时间"REFRESH_TOKEN_LIFETIME": timedelta(days=1), # refresh有效时间"ROTATE_REFRESH_TOKENS": False,"BLACKLIST_AFTER_ROTATION": False,"UPDATE_LAST_LOGIN": False,"ALGORITHM": "HS256","SIGNING_KEY": "WoShiLuanXieDe123456", # 加密秘钥"VERIFYING_KEY": "","AUDIENCE": None,"ISSUER": None,"JSON_ENCODER": None,"JWK_URL": None,"LEEWAY": 0,"AUTH_HEADER_TYPES": ("Bearer",), # 请求头用来标记token的字符串"AUTH_HEADER_NAME": "HTTP_AUTHORIZATION","USER_ID_FIELD": "id","USER_ID_CLAIM": "user_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","JTI_CLAIM": "jti","SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp","SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),"SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),"TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer","TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer","TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer","TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer","SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer","SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
}

上述代码中注释部分可自定义,秘钥随便写越复杂越好,不要泄露。

simplejwt包含一个access和一个refresh,一个前端请求想通过后端验证,头部需要包含access,如果access过期且refresh没有过期,则可以通过refresh刷新access。

视图

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'),...
]

simplejwt写好了两个视图,TokenObtainPairView用来获取access和refresh,TokenRefreshView用来刷新access。

TokenObtainPairView

 如图,此视图需要POST方法提交用户名和密码(Django的user模型)。提交后:

返回一个refresh和access:

{"refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTcwNjI1NzA2MiwianRpIjoiNWRiMTRhNWQyZDhkNDBiZWE0N2I4ZjdiNDJlMDk3ZGUiLCJ1c2VyX2lkIjoxfQ.4kc2U33GNTAJVUUBurJWUta8LNbNlB0Ec85H5ZqCsTg","access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzA2MTcwOTYyLCJqdGkiOiJjZDg2MDhhNzVlZGY0ZjBlODZiMmVjMWYyZjg2NmFkMCIsInVzZXJfaWQiOjF9.00fjHdR2BcQrcvk6mciof2JdacaXOOx6ba-eaS5wf_w"
}

 (如果报str类型无decode的错误,是因为版本问题,可以定位到源码部分将token.decode()改成token)

TokenRefreshView

此视图POST一个refresh,返回一个新的access,将刚生成的refresh提交:

得到一个新的access:

{"access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzA2MTcxMjA2LCJqdGkiOiIzOWE4N2YyOGM5ZjQ0ZDE2YmM0ZWU2NmQ4NmM1ZDc3YyIsInVzZXJfaWQiOjF9.qHZzS8xP0x0jGD5vncHEtFaXYRNEjo8NeTwFEAn9FCM"
}

 解析JWT

jwt只是一种编码方式,可以直接将上述内容在线解析,Python解析JWT可以通过这种方式:

from base64 import urlsafe_b64decode
from json import loadsdef jwt_decode(access):base64_str = access.split('.')[1]size = len(base64_str) % 4if size == 2:base64_str += '=='elif size == 3:base64_str += '='elif size != 0:raise ValueError('Invalid base64 string')payload = urlsafe_b64decode(base64_str.encode('utf-8')).decode()return loads(payload)

前端解析可以靠jwt-decode库。

使用JWT认证

在需要使用JWT认证的试图类中加上:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticatedclass IndexView(APIView):permission_classes = ([IsAuthenticated])def get(self, request):players = Player.objects.all()return Response(PlayersModelSerializer(players, many=True).data)

这样再访问index试图时,会提示未提供验证:

需要在请求中添加头信息Authorization:

headers: {'Authorization': 'Bearer ' + token.access,},

这里的Bearer是配置文件中SIMPLE_JWT的AUTH_HEADER_TYPES项,可自定义,但一定要和配置对应。在“Bearer”标识和access之间需要隔开一个空格,即"Bearer "+access,而不是"Bearer"+access。

使用postman测试下,添加头信息:

成功返回结果。postman可以直接添加Authorization,如果提供的是过期的access会返回:

 前端根据发送请求使用的工具不同,对应添加头部信息即可,如ajax:

$.ajax({url: 'https://yuming/api/index/',type: 'GET',headers: {'Authorization': 'Bearer ' + token.access,},data: {},async : false,success(resp){console.log(resp);}});

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

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

相关文章

第一讲_JavaScript概述及三种使用方式

JavaScript概述及三种使用方式 1. JavaScript概述1.1 JavaScript 的作用 2 JavaScript使用方式2.1 行内使用2.2 内部使用2.3 外部使用 1. JavaScript概述 JavaScript主页由三部分组成: ECMAScript:规定 JavaScript 核心,定义了语言的基本语…

系统架构设计师教程(十九)大数据架构设计理论与实践

大数据架构设计理论与实践 19.1 传统数据处理系统存在的问题19.2 大数据处理系统架构分析19.2.1 大数据处理系统面临挑战19.2.2 大数据处理系统架构特征19.3 Lambda架构19.3.1 Lambda架构对大数据处理系统的理解19.3.2 Lambda架构应用场景19.3.3 Lambda架构介绍19.3.4 Lambda架…

【ASP.NET Core 基础知识】--身份验证和授权--用户认证的基本概念

用户认证在网络安全中起着至关重要的作用。首先,它可以确保只有经过授权的用户才能访问特定的资源或服务,从而保护了系统和数据的安全。其次,用户认证可以帮助追踪和记录用户的活动,如果出现安全问题,可以追踪到具体的…

无人机调试开源软件

无人机调试开源软件有以下几个: MissionPlanner:一款功能丰富的开源软件,支持多种无人机,包括固定翼、多旋翼和直升机。它提供了实时的飞行数据监控、地图导航、任务规划以及详细的参数调整选项。APMPlanner2.0:专为A…

CSS--Emmet 语法

Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法. 目录 1. 快速生成HTML结构语法 1.1 快速生成HTML结构语法 2. 快速生成CSS样式语法 2.1 快速生成CSS样式语法 1. 快速生成HTML结构语法 1.1 快速生成HTML结构语法 1. 生成标…

【大厂AI课学习笔记】1.1.4 学科和学习路径

一、8大学科 特点是特点 :厚基础、重交叉、宽口径。 八大学科分别是:数学与统计、科学与工程、计算机科学与技术、人工智能核心、认知与神经科学、先进机器人技术、人工智能工具与平台。 每个学科,又向下延伸。 MORE: AI,即人…

【Java】Java类动态替换Class

Java类动态替换Class 通过Java的Class对象,可以实现动态替换Class。 预习几个知识点 getClassLoader Java提供的ClassLoader可用于动态加载的Java类,可以通过多种形式获取ClassLoader。比如通过Class类获取 // 通过Class获取 ClassLoader classLoade…

springIoc以及注解的使用

注解 注解的定义 注解(Annotation)是一种在 Java 程序中以元数据的形式对代码进行标记和说明的机制。它可以被添加到类、方法、字段、参数等程序元素上,用于提供额外的信息和指示。 也就是说注解是一种标记 注解怎么生效呢? 通…

网络相关知识

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、相关工具3.1 network profiler/ In…

WebSocket实现私信功能

&#xff37;ebSocket实现私信功能 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>配置文件 WebSocketConfig package com.example.common;im…

springboot的服务定位模式

一、文件解析器的例子 在开发中我们可能会解析CSV&#xff0c;JSON等文件类型&#xff0c;显然要用策略模式 我们先定义一个Parser接口 public interface Parser {void parse(String input); } Parser接口的实现类有JSONParser&#xff0c;CSVParser Component("CSV&qu…

gRPC 基本原理

基础知识 RPC的语义是远程过程调用&#xff08;Remote Procedure Call&#xff0c;RPC&#xff09;就是将一个服务调用封装在一个本地方法中&#xff0c;让调用者像使用本地方法一样调用服务&#xff0c;对其屏蔽实现细节。 RPC 会给对应的服务接口名生成一个代理类&#xff0c…

DPlayer m3u8 视频禁止下载

1. 介绍 正常的 m3u8 格式视频通过控制台是无法下载的&#xff0c;但是可以通过插件下载&#xff0c;下面介绍如何规避这个问题。 思路&#xff1a;后端生成一个一次性的密钥&#xff0c;前端放在请求头中&#xff0c;可以防止大部分插件下载。这里只说前端。 2. 实现 集成 …

[docker] 关于docker的面试题

docker命名空间&#xff1f; docker与虚拟机的区别&#xff1f; 容器虚拟机所有容器共享宿主机的内核每个虚拟机都有独立的操作系统和内核通过namespace实现资源隔离&#xff0c;通过cgroup实现限制资源的最大使用量完全隔离。每个虚拟机都有独立的硬件资源秒级启动速度分钟级…

超越 Node.js:Bun 的创新与突破

1. Bun Bun 是一个全新的 JavaScript 运行时&#xff0c;类似于 Node.js 和 Deno&#xff0c;它专注于提供出色的性能和开发者体验。Bun 的一些特点包括&#xff1a; 快速的性能&#xff1a;Bun 旨在提供高性能&#xff0c;无论是启动时间、执行速度还是安装依赖包的速度。 兼…

使用小米手机

额&#xff0c;因为很久以前的华为荣耀手机&#xff08;虽然现在不是华为了&#xff09;退役了&#xff0c;所以使用了小米手机。 文章目录 小米手机和电脑互联 小米手机和电脑互联 这里我用的ubuntu 22.04 和Redmi note 13 pro。其实开始我也没想到&#xff0c;小米居然可以直…

【3.6数据库系统】数据库备份与恢复技术

目录 1.数据备份1.1备份方式1.2备份类型 2.数据库故障与恢复 1.数据备份 1.1备份方式 △冷备份也称为静态备份&#xff0c;别是将数据库正常关闭&#xff0c;在停止状态下&#xff0c;将数据库的文件全部备份(复制)下来。 △热备份也称为动态备份&#xff0c;是利用备份软件&a…

林浩然的哲学穿越之旅:从道家“道”到柏罗丁的“太一”

林浩然的哲学穿越之旅&#xff1a;从道家“道”到柏罗丁的“太一” Lin Haoran’s Philosophical Journey Across Time: From Dao in Daoism to Plotinus’s “The One” 在这个充满奇思妙想的故事里&#xff0c;我们的主角林浩然可不是个普通的家伙。他是当代的一位哲学侦探&a…

【Java面试】redis

目录 Redis 介绍Reids常用5种数据类型一个字符串类型的值能存储最大容量是多少&#xff1f;Redis 有哪些适合的场景&#xff1f;Redis的并发竞争问题如何解决?什么是缓存穿透&#xff1f;如何避免&#xff1f;什么是缓存雪崩&#xff1f;何如避免&#xff1f;Redis 中设置过期…

Flutter开发进阶之Canvas

Flutter开发进阶之Canvas 在Flutter开发中Canvas作为一个绘制2D图形的工具&#xff0c;提供了一系列绘图方法&#xff0c;可以用来绘制各种形状、线条、文本和图像等&#xff1b; Canvas对象是作为CustomPainter的子组件进行构建的&#xff1b; void paint(Canvas canvas, Si…