drf组件之jwt认证
drf组件之jwt认证模块
一、认证规则
全称:json web token
解释:加密字符串的原始数据是json,后台产生,通过web传输给前台存储
格式:三段式 - 头.载荷.签名 - 头和载荷用的是base64可逆加密,签名用md5不可逆加密
内容:
头(基础信息,也可以为空):加密方式、公司信息、项目组信息、...
载荷(核心信息):用户信息、过期时间、...
签名(安全保障):头加密结果+载荷加密结果+服务器秘钥 的md5加密结果
认证规则:
后台一定要保障 服务器秘钥 的安全性(它是jwt的唯一安全保障)
后台签发token(login接口 ) -> 前台存储 -> 发送需要认证的请求带着token -> 后台校验得到合法的用户 -> 权限管理
为什么要有jwt认证:
1)服务器压力小, 后台不需要存储token,只需要存储签发与校验token的算法,效率远远大于后台存储和取出token完成校验
2) jwt算法认证,更适合服务器集群部署
二、认证模块
安装:pip install djangorestframework-jwt
模块包:rest_framework_jwt
采用drf-jwt框架,后期任务只需要书写登录
为什么要重写登录:drf-jwt只完成了账号密码登录,我们还需要手机登录,邮箱登录
为什么不需要重写认证类:因为认证规则已经完成且固定不变,变得只有认证字符串的前缀,前缀可以在配置文件中配置
三、JWT使用
jwt配置;
在settings.py文件中配置,如果不配置,默认走jwt默认的

jwt插件的三个接口:

在urls.py中配置

在postman中测试一下签发token

注意:上面三个接口都是发送POST请求
四、利用JWT实现多方式登录
注:APIResponse 为自定义Response对象
# views.py
from rest_framework.views import APIView
from . import models,serializers
from utils.response import APIResponse
class LoginAPIView(APIView):
    # 登录接口应该禁用所有的认证和、权限,因为不管是谁都应该能进来
    authentication_classes = []
    permission_classes = []
    def post(self, request, *args, **kwargs):
        # 将数据传到序列化组件进行校验
        user_ser = serializers.LoginSerializer(data=request.data)
        user_ser.is_valid(raise_exception=True)
        return APIResponse(msg='login success', data={
            'username': user_ser.user.username,
            'token': user_ser.token
        })
注意:
通过user对象生成payload载荷
payload = jwt_payload_handler(user)
通过payload签发token
token = jwt_encode_handler(payload)
# serializer.py
from rest_framework.serializers import ModelSerializer, CharField, ValidationError, SerializerMethodField
from . import models
from django.contrib.auth import authenticate
import re
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
class LoginSerializer(ModelSerializer):
    username = CharField(write_only=True)
    password = CharField(write_only=True)
    class Meta:
        model = models.User
        fields = ('username', 'password')
    def validate(self, attrs):
        # user_obj = authenticate(**attrs)
        # if not user_obj:
        #     raise ValidationError('用户名或密码错误')
        # 账号密码登录 ==》 多方式登录
        user = self._many_method_login(**attrs)
        # 通过user对象生成payload载荷
        payload = jwt_payload_handler(user)
        # 通过payload签发token
        token = jwt_encode_handler(payload)
        # 将user和token存放在序列化对象中,方便返回到前端去
        self.user = user
        self.token = token
        return attrs
    # 多方式登录 (用户名、邮箱、手机号三种方式登录)
    def _many_method_login(self, **attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        # 利用正则匹配判断用户输入的信息
        # 1.判断邮箱登录
        if re.match(r'.*@.*', username):
            user = models.User.objects.filter(email=username).first()  # type: models.User
        # 2.判断手机号登录
        elif re.match(r'^1[3-9][0-9]{9}$',username):
            user = models.User.objects.filter(mobile=username).first()
        # 3.用户名登录
        else:
            user = models.User.objects.filter(username=username).first()
        if not user:
            raise ValidationError({'username': '账号有误'})
        if not user.check_password(password):
            raise ValidationError({'password': '密码错误'})
        return user
使用postman测试代码:

五、前后台分离模式下信息交互规则
"""
1)任何人都能直接访问的接口
	请求不是是get、还是post等,不需要做任何校验
2)必须登录后才能访问的接口
	任何请求方式都可能做该方式的限制,请求必须在请求头中携带认证信息 - authorization
3)前台的认证信息获取只能通过登录接口
	前台提供账号密码等信息,去后台换认证信息token
4)前台如何完成登录注销
	前台登录成功一般在cookie中保存认证信息token,分离注销就是前台主动清除保存的token信息
"""
drf组件之jwt认证的更多相关文章
- DRF框架(七) ——三大认证组件之频率组件、jwt认证
		drf频率组件源码 1.APIView的dispatch方法的 self.initial(request,*args,**kwargs) 点进去 2.self.check_throttles(re ... 
- drf认证组件、权限组件、jwt认证、签发、jwt框架使用
		目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ... 
- drf框架中jwt认证,以及自定义jwt认证
		0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ... 
- DRF项目之JWT认证方式的简介及使用
		什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ... 
- drf认证组件(介绍)、权限组件(介绍)、jwt认证、签发、jwt框架使用
		目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ... 
- DRF之JWT认证
		一.JWT认证 JWT构成 JWT分为三段式:头.体.签名(head.payload.sgin) 头和体是可逆加密的,让服务器可以反解析出user对象,签名是不可逆加密,保证整个token的安全性的. ... 
- drf的JWT认证
		JWT认证(5星) token发展史 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token(本质就是tok ... 
- jwt 认证
		目录 jwt 认证示意图 jwt 认证算法:签发与检验 drf 项目的 jwt 认证开发流程(重点) drf-jwt 框架基本使用 token 刷新机制(了解) jwt 认证示意图 jwt 优势 1 ... 
- DRF 组件
		DRF组件中的认证 授权 频率限制 分页 注册器 url控件 
随机推荐
- mac本地安装单机hadoop--学习笔记
			Mac配置hadoop1.修改 /etc/hosts127.0.0.1 localhost2.下载hadoop2.9.0和jdk并安装配置相应环境 vim /etc/profile export HA ... 
- macport命令--笔记
			macport命令:sudo port sync //同步本地和全球的ports tree,但不检查自己是否有更新.sudo port install python36 //安装python36sud ... 
- win7重装系统经验总结报告(2013年6月29日凌晨1:45)
			win7重装系统经验总结报告(2013年6月29日凌晨1:45) 步骤: 1.考虑被重做的电脑是否有重要文件在C盘.有则转移到D盘等非系统盘. 2.看该电脑是2GB内存还是4GB以上内存. 3.准备好 ... 
- SpringBoot整合MybatisPlus3.X之分页插件(四)
			注:详细请看2.X博客中,3.X直接上代码. 建议装一个MybatisX插件,可以在Mapper和Xml来回切换 pom.xml <dependencies> <dependency ... 
- Windows 程序包管理器 Chocolatey:一条命令装软件
			Windows 程序包管理器 Chocolatey:一条命令装软件 本文原始地址:https://sitoi.cn/posts/46278.html 介绍 Chocolatey 是一种软件管理解决方案 ... 
- 优化 Git Commit Message
			目前很多项目都是通过 Git 进行管理的,Git 每次提交代码的过程中 提交说明 commit message 是必须的.但仅仅必须是不够的,好的提交说明可以帮助我们提高项目的整体质量. 作用与优点 ... 
- [考试反思]0801NOIP模拟测试11
			8月开门红. 放假回来果然像是神志不清一样. 但还是要接受这个事实. 嗯,说好听点,并列rank#7. 说难听点,垃圾rank#18. 都不用粘人名就知道我是哪一个吧... 因为图片不能太长,所以就不 ... 
- $color$有色图
			不想看题解的请速撤离 为防被骂灌输题解,撤离缓冲区 这里没字 $Ploya$神题一道,所以我自己做不出来,颓了一部分题解. 由于理(颓题)解不(没)深(脸)中途又拿了$std$对拍(输出中间结果并qj ... 
- P3128 [USACO15DEC]最大流
			秒切树上查分....(最近一次集训理解的东西) 但是,我敲了半小时才切掉这道题.... 我一直迷在了“边差分”和“点差分”的区别上. 所以,先说一下此题,再说一下区别. 首先,想到差分很容易. 然后, ... 
- html5不能播放视频的方法
			html5不能播放视频的方法H5不能播放视频的方法 格式工厂转换成 AVC 注意音频流 采样率和比特率 设置低一点 不然播放会卡住 还有点击播放必须要click 不要用touchstart没效果的 
