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",}

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


三、多方式登录

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

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

相关文章

springboot整合webservice使用总结

因为做的项目中用到了webservice,所以在此总结一下。 一、webservice简介 Web Service也叫XML Web Service, WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务,使…

mfc100u.dll文件丢失,有五种不同解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“找不到mfc100u.dll文件”。那么,mfc100u.dll文件到底是什么?为什么会出现丢失的情况?本文将详细介绍mfc100u.dll文件的作用以及丢失的原因,并…

IDEA设置新建类注释、手动注释详解

文章目录 一、背景二、模板三、设置方法1、新建类注释设置2、手动注释设置 一、背景 每次在一台新电脑安装idea,都需要重新设置idea注释配置,说常用吧,也就新安装时才用,时间久步骤容易忘记,所以用此文章记录一下。 二…

【备忘】今天写一下如何买免费证书

使用场景 使用微信支付宝支付转账时小游戏小程序接口开发时其它情况 开发中不可避免的会接触https,有的公司有运维去做这个事,有的是老板自己会搞https证书,咱多了解一项技术也是好事。 如何买证书 登录阿里云控制台,搜索ssl证…

el-pagination 当代码中修改pageIndex时,页面始终展示第一页的数据

问题描述 查询表格,初始化时,pageIndex默认为1,后面因为查询条件数据缓存,pageIndex设置为了4,但是pagenation组件使用都是展示1,页面的数据确实是第4页的数据; 问题分析 组件外部的数据没有…

SAP ABAP ZPL打印

前言 本文用于简单介绍在SAP中使用ZPL语言进行打印的开发步骤,由于对ZPL语言并不是很熟悉,所以ZPL相关的部分并不会很深入,主要介绍在SAP端如何动态填充ZPL内容及预览、打印。 什么是ZPL ZPL是斑马条码打印机工业型号用的编程语言。利用这些…

多模态——旷视大模型Vary更细粒度的视觉感知实现文档级OCR或图表理解

概述 现代大型视觉语言模型(LVLMs),例如CLIP,使用一个共同的视觉词汇,以适应多样的视觉任务。然而,在处理一些需要更精细和密集视觉感知的特殊任务时,例如文档级OCR或图表理解,尤其…

【信号处理:小波包转换(WPT)/小波包分解(WPD) 】

【信号处理:小波包转换(WPT)/小波包分解(WPD) 】 小波包变换简介WPT/WPD的基础知识WPT/WPD的主要特点The Wavelet Packet Transform 小波包变换前向小波数据包变换最佳基础和成本函数数学中波纹的最佳基础其他成本函数…

在Cadence中单独添加或删除器件与修改网络的方法

首先需要在设置中使能 ,添加或修改逻辑选项。 添加或删除器件,点击logic-part,选择需要添加或删除的器件,这里的器件必须是PCB中已经有的器件,Refdes中输入添加或删除的器件标号,点击Add添加。 添加完成后就会显示在R1…

Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

案例089:基于微信小程序的校园综合服务平台设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

静态网页设计——个人简介网站

前言 使用经典前端三件套HTMLCSSJavascript编写了一个关于个人简介的静态网页,可以根据自己的需要,十分简单的进行修改。 首页 首页由上方的菜单栏以及菜单栏下面的轮播图组成,再往下走,是关于自己的兴趣爱好的部分&#xff0c…