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认证的更多相关文章

  1. DRF框架(七) ——三大认证组件之频率组件、jwt认证

    drf频率组件源码 1.APIView的dispatch方法的  self.initial(request,*args,**kwargs)  点进去 2.self.check_throttles(re ...

  2. drf认证组件、权限组件、jwt认证、签发、jwt框架使用

    目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...

  3. drf框架中jwt认证,以及自定义jwt认证

    0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...

  4. DRF项目之JWT认证方式的简介及使用

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  5. drf认证组件(介绍)、权限组件(介绍)、jwt认证、签发、jwt框架使用

    目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...

  6. DRF之JWT认证

    一.JWT认证 JWT构成 JWT分为三段式:头.体.签名(head.payload.sgin) 头和体是可逆加密的,让服务器可以反解析出user对象,签名是不可逆加密,保证整个token的安全性的. ...

  7. drf的JWT认证

    JWT认证(5星) token发展史 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token(本质就是tok ...

  8. jwt 认证

    目录 jwt 认证示意图 jwt 认证算法:签发与检验 drf 项目的 jwt 认证开发流程(重点) drf-jwt 框架基本使用 token 刷新机制(了解) jwt 认证示意图 jwt 优势 1 ...

  9. DRF 组件

    DRF组件中的认证  授权  频率限制   分页  注册器  url控件

随机推荐

  1. 基于深度学习方法的dota2游戏数据分析与胜率预测(python3.6+keras框架实现)

    很久以前就有想过使用深度学习模型来对dota2的对局数据进行建模分析,以便在英雄选择,出装方面有所指导,帮助自己提升天梯等级,但苦于找不到数据源,该计划搁置了很长时间.直到前些日子,看到社区有老哥提到 ...

  2. 变量 + 数据类型(数字 + 字符串)(day03整理)

    目录 一.上节课回顾 四 编程语言分类 (一) 机器语言 (二)汇编语言 (三) 高级语言 (四) 网络瓶颈效应 五.执行python程序两种方式 (一) 交互式(jupytre) (二) 命令行式( ...

  3. Leetcode Tags(5)Hash Table

    一.500. Keyboard Row 给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词. 输入: ["Hello", "Alaska", &q ...

  4. 第七篇 Flask实例化配置及Flask对象配置

    一.Flask对象的配置 Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? ...

  5. ORM之多表操作

    一.创建模型 from django.db import models # Create your models here. class Book(models.Model): nid = model ...

  6. spring cloud 2.x版本 Feign服务发现教程(内含集成Hystrix熔断机制)

    前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server和eureka-client的实现. 参考 ...

  7. 前端技术之:如何在Vue中使用clipboard.js复制服务端数据

    第一步 创建点击对象页面元素,并绑定业务数据. <el-button type="text" size="mini" class="copy-b ...

  8. 心脏滴血漏洞复现(CVE-2014-0160)

    心脏滴血漏洞简述 2014年4月7日,OpenSSL发布安全公告,在OpenSSL1.0.1版本至OpenSSL1.0.1f Beta1版本中存在漏洞,该漏洞中文名称为心脏滴血,英文名称为HeartB ...

  9. javascript创建一个基于数组的栈结构

    栈是一种遵从后进先出(LIFO)原则的有序集合.新添加或待删除的元素都保存在栈的同 一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 栈拥有以下方法: push(eleme ...

  10. Spring Boot实战之定制URL匹配规则

    本文首发于个人网站:Spring Boot实战之定制URL匹配规则 构建web应用程序时,并不是所有的URL请求都遵循默认的规则.有时,我们希望RESTful URL匹配的时候包含定界符". ...