DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

news2024/9/23 1:29:03

文章目录

  • 一、djangorestframework-simplejwt快速使用
    • 1.基础使用步骤
    • 2.自己配置视图校验访问
      • 局部配置认证及权限类
      • 全局配置认证及权限类
    • 3.关于双token认证问题
  • 二、定制返回格式
  • 三、多方式登录

一、djangorestframework-simplejwt快速使用

JWT主要用于签发登录接口需要配合认证类 JWT目前有两种 JtwSimplejwt(jwt比较老了 simple现在比较流行)

1.基础使用步骤

  1. 安装:建议使用pycharm可以安装到指定解释器
	pip install djangorestframework-simplejwt
  1. simplejwt默认使用auth_user表签发token,所以我们直接新建项目后执行迁移命令
	-makemigrations
	-migrate
  1. 创建一个超级用户:createsuperuser
  2. 签发登录:只需要在路由中配置(simplejwt帮我们写好了登录接口以及权限类)

路由配置

	'导入模块'
	from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refresh
	urlpatterns = [
	    path('login/', token_obtain_pair),  # 登录  签发token
	    path('verify/', token_verify),  # 验证token 是否有效
    	path('refresh/', token_refresh),  # 刷新token
	]

settings配置

	'注册app'
	INSTALLED_APPS = [
	    ...
	    'rest_framework_simplejwt',
	    ...
	]

	
	import datetime
	SIMPLE_JWT = {
	    # token有效时长
	    'ACCESS_TOKEN_LIFETIME': datetime.timedelta(minutes=30),
	    # token刷新后的有效时间
	    'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1),
	}

此时直接访问即可,它都帮我们写好了,在请求体中携带刚刚创建的超级用户的账号密码就会返回token(因为是simplejwt它是双Token认证)

在这里插入图片描述

因为是双token认证,获取到的access才是真正使用的token,而refresh则是用于更新access。因为access过期时间很短,过期后就需要重新生成access的token保证token的安全,所以就需要使用refresh用来变更新的有效token

变更新的有效token
在这里插入图片描述


验证有效期token
在这里插入图片描述


2.自己配置视图校验访问

我们定义了一个book视图类,它只允许访问时在请求头里面携带了合法的token值才能通过认证。

路由配置

	from rest_framework_simplejwt.views import token_obtain_pair, token_verify
	urlpatterns = [
	    path('login/', token_obtain_pair),  # 登录  签发token
	    path('verify/', token_verify),  # 验证token 是否有效
	    path('refresh/', token_refresh),  # 刷新token
	]

局部配置认证及权限类

视图配置

	from rest_framework.views import APIView
	from rest_framework_simplejwt.authentication import JWTAuthentication
	from rest_framework.permissions import IsAuthenticated
	from rest_framework.response import Response
	
	'局部配置,必须配合权限类'
	class BookView(APIView):
	    '''配置的Jwt认证,但是得在headers添加,如果不添加的话,就不会生效,添加才可生效'''
	    authentication_classes = [JWTAuthentication]  # 登录认证
	    permission_classes = [IsAuthenticated]  # 配置了权限类,没登录的就没有权限访问了
	    '一旦配置了去认证类和权限类后,refresh的token就无法使用,会显示令牌类型错误,只能使用access的token'
	
	    def get(self,reqeust):
	        return Response({'测试测试'})
	
	'''
	这个时候直接访问我们的接口,就会发生错误,"detail":"身份认证信息未提供"
	因为我们访问的时候需要带上simplejwt的token
	固定格式为:Authorization:Bearer 注意这里哟一个空格,在空格后面填写签发过的token
	'''

全局配置认证及权限类

settings中配置

	# 全局配置
	REST_FRAMEWORK = {  '它自己内置的登录是哪怕配置了全局也不会进行认证,源码中进行了禁用'
	    'DEFAULT_AUTHENTICATION_CLASSES': [
	        'rest_framework_simplejwt.authentication.JWTAuthentication'
	    ],
	    'DEFAULT_PERMISSION_CLASSES': [
	        'rest_framework.permissions.IsAuthenticated',
	    ],
	}

携带登录后,服务端响应给我们的token值来访问,token值的开头必须是Bearer+空格,因为在源码内部获取校验token值前,会先通过空格进行分隔一下,第一个值是否为Bearer,如果是的话才会获取空格后面的token值来进行校验,所以我们后续会重写一些方法,不需要遵守一些不必要的规则

在这里插入图片描述

注意:只要当前的access的token没过期,而之前签发的access的token和后来刷新签发的access的token都可以使用

3.关于双token认证问题

	1)单token
		-用户登录后----->签发token---->但是有过期时间
			1.设置太短的token过期时间,如:3 minute后就需要重新登录,体验太差,一天啥事不干就重新登录
			2.设置太长的token过期时间,如:7 day,7天都不需要登录----->容易被人截获到长时间使用--->不安全
	2)双token
		-用户登录后---->签发两个token----->目前的verify检验接口,只要是它签发的token,都会认证通过
			例如:access:过期时间短 3分钟
			例如:refresh:过期时间长 7-用户正常用,都会用access,不会用refresh
		-access过会有过期了,一旦过期就用不了了---->然后可以通过refresh这个token调用刷新接口,在签发一个access的token
		-通过refresh再次签发的token这个过程,是不需要登录的,这对用户是无感知的
		-后续再使用access这个token发请求

	'认证类:就不能使用refresh的token' 

	'''
	双认证的好处就是,一旦access的token被别人截取到了,拿着模拟发请求,只能在有效时间内使用,
	因为access的token很快会过期,这样就保障安全
	'''

二、定制返回格式

继承auth_user表完成签发登录,但是它的返回格式太固定了只有Token,但是我们想自定义格式呢?

	如:
	{
		'code': 100,
	    'msg': '登录成功',
	    'username': self.user.username,
	    'token':'fdsafsfsafsadf'
    }

1.写个序列化类,重写validate ,返回什么,前端看到什么

	from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
	
	class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
	    @classmethod
	    def get_token(cls, user):
	        token = super().get_token(user)  # 签发用户
	        token['name'] = user.username  # 往荷载里面添加用户名称
	        return token
		'''重写get_token方法,它返回的token中就是荷载的内容'''
	
	    def validate(self, attrs):
	        old_data = super().validate(attrs)
	        data = {'code': 100,
	                'msg': '登录成功',
	                'username': self.user.username,
	                'refresh': old_data['refresh'],
	                'access': old_data['access']
	                }
	        return data

2.在settings配置文件中配置

	SIMPLE_JWT = {
	    "TOKEN_OBTAIN_SERIALIZER": "app01.serializer.MyTokenObtainPairSerializer",
	}

效果如下
在这里插入图片描述


三、多方式登录

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

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

相关文章

自定义View之理解测量onMeasure和布局onLayout过程

Android应用的用户界面中,我们经常需要自定义View以满足特定的设计需求。在自定义视图的过程中,理解视图的测量(onMeasure)和布局(onLayout)过程至关重要。本篇博客将用通俗的语言,为你解析这两…

MySQL是如何做到可以恢复到半个月内任意一秒的状态的?

MySQL的逻辑架构图 MySQL中两个重要的日志模块:redo log(重做日志)和binlog(归档日志) 我们先来看redo log: 介绍一个MySQL里经常说到的WAL技术,即Write-Ahead-Logging,它的关键点…

中国计算机学会推荐国际学术会议及时间(计算机体系结构/高性能计算/存储系统)

中国计算机学会推荐国际学术会议及时间 (计算机体系结构/高性能计算/存储系统) 参考资料 参考链接: call4papers

npm、pnpm和yarn 的区别

包管理工具是JavaScript开发中不可或缺的一部分,它们可以帮助我们方便地安装、更新、删除和管理项目所依赖的各种库和模块。 目前,最流行的包管理工具有npm、yarn和pnpm,它们各有各的特点和优劣势。 本文将试着对这三个工具进行全面的对比。…

新电脑究竟要不要登录微软账户?看这个就明白了

记得Windows11出来之后,新电脑预装的系统开机之后就会强制用户登录微软账户,不然就没法进入下一步。 如果你在重装了Windows10系统之后,到了联网步骤时连接上了网络,那么也会强制你登录微软账户,而不是创建本地账户&am…

Spring Data JPA从入门到精通--对查询结果的扩展

如果 我们想仅仅返回实体中的几个字段,应该怎么做呢? 基于projections的思路,其实是比较容易的。 我们只需要声明一个 接口,包含要返回的属性的方法即可,例如: Repository里面的写法如下,直接…

面向对象编程(高级)

面向对象编程(高级) 1、类变量和类方法 (1) 概念 类变量,也称为静态变量,是指在类级别声明的变量。它们与特定类相关联,而不是与类的实例(对象)相关联。每个类变量只有…

jmeter的安装与目录介绍

1、启动 apache-jmeter-5.0\bin 2、永久修改中文配置 zh-CN就行了

Docker与虚拟机的比对

在Windows操作系统上的对比: 但是官方还是建议我们尽量不要将Docker直接安装到Windows操作系统上。

单机多进程,每个进程多张卡 mpi nccl 程序设计检验

做了部分注释&#xff0c;比较乱 本示例结构&#xff1a; 1&#xff0c;源代码 #include <stdlib.h> #include <stdio.h> #include "cuda_runtime.h" #include "nccl.h" #include "mpi.h" #include <unistd.h> #include <…

MySQL的基础架构之内部执行过程

MySQL的逻辑架构图 如上图所示&#xff0c;MySQL可以分为Server层和存储引擎层两部分&#xff1a; 1&#xff09;Server层涵盖了MySQL的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#xff0c;所有跨存储引擎…

Javaweb之Mybatis的基础操作的详细解析

1. Mybatis基础操作 学习完mybatis入门后&#xff0c;我们继续学习mybatis基础操作。 1.1 需求 需求说明 通过分析以上的页面原型和需求&#xff0c;我们确定了功能列表&#xff1a; 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除 …

腾讯云轻量应用服务器详细介绍_2024年更新

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别便宜&#xff0c;大带宽&#xff0c;但是限制月流量。轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、…

数据库应用课程学生表、课程表、选课表mysql语句实战练习

1、创建表结构 目录 1、创建表结构 1.1 创建学生表 1.2 创建课程表 1.3创建选课表 1.4 插入学生表 1.5 插入课程表 1.6 插入选课表 2.以下布置操作是根据以上建立的三张表格基础上进行mysql语句的练习 2.1 查询学生信息并添加入新表 2.1.1 查询全体学生的学号与姓名&#…

ECharts配置个性化图表:圆环、立体柱状图

官网调试地址&#xff1a;调试 效果图&#xff1a; 配置&#xff1a; option {color: [#29BEFF, #A2DC00, #FFC400, #FF7F5C, #CA99FC],// 提示窗tooltip: {trigger: item,show: false},// 图例legend: {top: 5%,left: center,show: false},// 数据series: [{name: Access …

23年中科院1区算法|开普勒优化算法原理及其利用(Matlab/Python)

CEC2017中的测试 本文作者将介绍一个2023年发表在中科院1区期刊《Knowledge -Based Systems》上的优化算法——开普勒优化算法(Kepler optimization algorithm&#xff0c;KOA)[1] 算法性能上&#xff0c;与鹈鹕、黏菌、灰狼和鲸鱼等一众优化算法在CEC2014、CEC2017、CEC2020和…

SRC中的一些信息收集姿势

目录 前言 搜索引擎 Google、bing、baidu Fofa、360q、鹰图 提炼图标 提炼标题 提炼Body 提炼特殊路由 提炼特殊服务 GIT提炼 总结 本文由掌控安全学院 - 杳若 投稿 前言 前前后后挖了四个月的EDUSRC&#xff0c;顺利从路人甲升到了网络安全专家&#xff0c;从提交…

技术扫盲:如何优雅的使用 java -jar

java -jar xxx.jar java -jar 是一个用于在命令行界面中执行 Java 可执行 JAR 文件的命令。它的语法如下&#xff1a; java -jar <JAR 文件路径> [参数]其中&#xff1a; java 是 Java 运行时环境的可执行文件。-jar 是一个选项&#xff0c;表示要执行的文件是一个 JA…

南昌本地人才招聘网站有哪些

南昌吉鹿力招聘网是一家南昌本地人才招聘网站&#xff0c;真正专属于年轻人的移动社交招聘平台&#xff0c;提供职业档案、人脉、求职、聊天等功能。主要优点是扩大招聘渠道&#xff0c;通过社区招聘平台找到工作机会&#xff0c;并为用户提供职业建议和职位发布等服务。 吉鹿…

技术资讯:Vue 3.4 新版本发布,1分钟快速看看改了啥!

大家好&#xff0c;我是大澈&#xff01; 本文约1000字&#xff0c;整篇阅读大约需要1分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…