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

本文主要是介绍DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、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_refreshurlpatterns = [path('login/', token_obtain_pair),  # 登录  签发tokenpath('verify/', token_verify),  # 验证token 是否有效path('refresh/', token_refresh),  # 刷新token]

settings配置

	'注册app'INSTALLED_APPS = [...'rest_framework_simplejwt',...]import datetimeSIMPLE_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_verifyurlpatterns = [path('login/', token_obtain_pair),  # 登录  签发tokenpath('verify/', token_verify),  # 验证token 是否有效path('refresh/', token_refresh),  # 刷新token]

局部配置认证及权限类

视图配置

	from rest_framework.views import APIViewfrom rest_framework_simplejwt.authentication import JWTAuthenticationfrom rest_framework.permissions import IsAuthenticatedfrom 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 TokenObtainPairSerializerclass MyTokenObtainPairSerializer(TokenObtainPairSerializer):@classmethoddef 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",}

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


三、多方式登录

这篇关于DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/568277

相关文章

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

java中4种API参数传递方式统一说明

《java中4种API参数传递方式统一说明》在Java中,我们可以使用不同的方式来传递参数给方法或函数,:本文主要介绍java中4种API参数传递方式的相关资料,文中通过代码介绍的非常详细,需要的... 目录1. 概述2. 参数传递方式分类2.1 Query Parameters(查询参数)2.2 Path

MybatisPlus中几种条件构造器运用方式

《MybatisPlus中几种条件构造器运用方式》QueryWrapper是Mybatis-Plus提供的一个用于构建SQL查询条件的工具类,提供了各种方法如eq、ne、gt、ge、lt、le、lik... 目录版本介绍QueryWrapperLambdaQueryWrapperUpdateWrapperL

idea设置快捷键风格方式

《idea设置快捷键风格方式》在IntelliJIDEA中设置快捷键风格,打开IDEA,进入设置页面,选择Keymap,从Keymaps下拉列表中选择或复制想要的快捷键风格,点击Apply和OK即可使... 目录idea设www.chinasem.cn置快捷键风格按照以下步骤进行总结idea设置快捷键pyth

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

java敏感词过滤的实现方式

《java敏感词过滤的实现方式》文章描述了如何搭建敏感词过滤系统来防御用户生成内容中的违规、广告或恶意言论,包括引入依赖、定义敏感词类、非敏感词类、替换词类和工具类等步骤,并指出资源文件应放在src/... 目录1.引入依赖2.定义自定义敏感词类3.定义自定义非敏感类4.定义自定义替换词类5.最后定义工具类