DRF-JWT
DRF-JWT
一、JWT
JWT全称: json web token,
作用:将原始的数据json加密成字符串,通过后台将加密的字符串给前台存储(token)
格式:三段式,头.载荷.签名 , 头和载荷都是采用base34可逆加密,签名采用md5不可逆加密
- 头(基础信息,也可以为空):加密方式、公司信息、项目中信息....
 - 载荷(核心信息): 用户信息、过期时间...
 - 签名(安全保障): 头加密结果+载荷加密结果+服务器秘钥的md5加密的结果
 - 注意:后台一定要保障服务器秘钥的安全,他是jwt唯一安全保障,后台签发token -> 前台存储 -> 发送需要认证的请求带着token -> 后台校验得到合法的用户
 
jwt认证优点:
- 后台不需要存储token,只需要存储签发与校验tokne的算法,效率远远大于后台存储和取出完成token的校验
 - jwt算法认证,更适合服务器集群的部署
 
采用drf-jwt框架,后期任务主需要书写登录,drf-jwt只完成了账号密码登录,我们还需要手机登录,邮箱登录,不需要重写认证类,因为认证规则已经完成且固定不变,变得只有认证字符串的前缀,前缀可以在配置文件中配置
二、jwt模块安装
# 安装
>:pip install djangorestframework-jwt
# 模块
rest_framework_jwt
三、前后端分离模式下信息交互规则
任何人都可以直接访问的接口
请求不论是get、还是post请求方式,不需要任何的校验
必须登录后才能访问接口
任何请求方式都进行限制,请求中必须在请求头中携带认证信息 - authorization
前台认证信息获取只能通过登录接口
前台提供账号和密码等信息,到后台进行校验返回认证信息token加密字符串
前台如何完成注销
前台登录成功一般在cookie中保存认证信息token,登录注销就是前台主动清除保存的token加密字符串信息
四、jwt模块使用
4.1全局配置
# rest_framework全局配置 认证
'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework.authentication.SessionAuthentication',
    'rest_framework.authentication.BasicAuthentication'
],
# jwt认证类配置
'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
],
# 局部禁用
authentication_classes = [] # 
# 局部启用
from user.authentications import JSONWebTokenAuthentication
authentication_classes = [JSONWebTokenAuthentication]
只需将rest_framework全局配置认证改成JWT认证
4.2 token过期时间配置
# drf-jwt配置
import datetime
JWT_AUTH = {
    # 过期时间,生成的took七天之后不能使用
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
	# 刷新时间 之后的token时间值
    # 'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
	# 请求头携带的参数
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
}
4.3JWT认证使用
from django.conf.urls import url
from . import views
from rest_framework_jwt.views import ObtainJSONWebToken,obtain_jwt_token,verify_jwt_token,refresh_jwt_token
urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^test/', views.TestAPIview.as_view()),
    url(r'^user/', views.UserListAPIView.as_view()),
    url(r'^login/', views.LoginAPIView.as_view()),
    # jwt认证
    # url(r'^jwt/login/', views.JwtLoginAPIView.as_view()),
    url(r'^jwt/login/$', views.JwtLoginAPIView.as_view()),
    url(r'^jwt/center/$', views.JwtUserCenterAPIView.as_view()),
]
1.多方登录认证
# url.py
url(r'^login/$', views.LoginAPIView.as_view()),
url(r'^user/center/$', views.UserCenterAPIView.as_view()),
# 1. 反序列化类.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')
    # 在全局钩子中签发token
    def validate(self, attrs):
        # user = authenticate(**attrs)V
        # 账号密码登录 => 多方式登录
        user = self._many_method_login(**attrs)
        # 签发token,并将user和token存放到序列化对象中
        payload = jwt_payload_handler(user)  # 获取用户信息
        token = jwt_encode_handler(payload) # 生成token
        self.user = user
        self.token = token
        return attrs
    # 多方式登录
    def _many_method_login(self, **attrs):
        username = attrs.get('username')
        password = attrs.get('password')
        if re.match(r'.*@.*', username):
            user = models.User.objects.filter(email=username).first()  # type: models.User
        elif re.match(r'^1[3-9][0-9]{9}$', username):
            user = models.User.objects.filter(mobile=username).first()
        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
# 2.view.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):
        serializer = serializers.LoginSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        return APIResponse(msg='login success', data={
            'username': serializer.user.username,
            'token': serializer.token
        })
4.2 获取用户信息
# 序列化类.py
class JwtUserModelSerializer(serializers.ModelSerializer):
    password = serializers.SerializerMethodField()
    def get_password(self, obj):
        return "#########"
    class Meta:
        model = models.User
        fields = ('username', 'password',  'email', 'first_name', 'last_name')
# view.py
class JwtUserCenterAPIView(APIView):
    # 权限认证
    permission_classes = [IsAdminUser]
    def get(self, request, *args, **kwargs):
        user = request.user
        serializer_obj = serializers.JwtUserModelSerializer(user)
        return APIResponse(data=serializer_obj.data)
五、总结
jwt模块使用:
- 使用jwt模块认证的时候需要在全局配置认证使用的是jwt的认证模块
 - 可以设置token的过期时间,在setting.py中配置
 
DRF-JWT的更多相关文章
- DRF JWT的用法 & Django的自定义认证类 & DRF 缓存
		
JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae DRF JWT 的使用方法: 1. 安装 DRF JWT # pip install djang ...
 - DRF JWT认证(一)
		
为什么要使用JWT认证?构成和原理又是什么?怎么还有Base64的事?我都写了
 - DRF JWT认证(二)
		
快速上手JWT签发token和认证,有这一篇就够了,DRF自带的和自定义的都帮你总结好了,拿去用~
 - django drf JWT
		
建议使用djangorestframework-jwt或者djangorestframework_simplejwt,文档为 https://github.com/GetBlimp/django-re ...
 - 9) drf  JWT 认证   签发与校验token 多方式登陆  自定义认证规则反爬  admin密文显示
		
一 .认证方法比较 1.认证规则图 django 前后端不分离 csrf认证 drf 前后端分离 禁用csrf 2. 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 ...
 - drf JWT认证模块与自定制
		
JWT模块 在djangorestframework中,有一款扩展模块可用于做JWT认证,使用如下命令进行安装: pip install djangorestframework-jwt 现在,就让我们 ...
 - drf☞jwt自动签发与手动签发
		
目录 一.自动签发 二.手动签发 一.自动签发 urls from rest_framework_jwt.views import obtain_jwt_token # 使用jwt自带的登录视图 ur ...
 - django drf框架中的user验证以及JWT拓展的介绍
		
登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...
 - drf框架 - JWT认证插件
		
JWT认证 JWT认证方式与其他认证方式对比: 优点 1) 服务器不要存储token,token交给每一个客户端自己存储,服务器压力小 2)服务器存储的是 签发和校验token 两段算法,签发认证的效 ...
 - DRF之三大认证
		
一.用户认证Authorticatons 1.源码解析 第一步. 找入口 def dispatch(self, request, *args, **kwargs): # 1.首先我们进入的是APIVi ...
 
随机推荐
- CodeForces - 755C PolandBall and Forest (并查集)
			
题意:给定n个数,Ai的下标为1~n.对于每一个i,Ai与i在同一个树上,且是与i最远的点中id最小的点(这个条件变相的说明i与Ai连通).求森林中树的个数. 分析:若i与Ai连通,则在同一个树上,因 ...
 - 启用root关闭客人会话
			
1.位root用户设置密码: sudo passwd root 2.修改配置文件/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf(先备份) 添加如下在文 ...
 - 留学萌新Essay写作须知
			
Essay是留学生们接触比较多的一项留学生作业,但尽管如此,依旧有部分同学对于essay写作是没有足够的把握的.随着开学季的到来,很多萌新初次接触Essay写作,难免会有很多不懂得地方.所以今天小编就 ...
 - [Updating]点分治学习笔记
			
Upd \(2020/2/15\),又补了一题 LuoguP2664 树上游戏 \(2020/2/14\),补了一道例题 LuoguP3085 [USACO13OPEN]阴和阳Yin and Yang ...
 - Day 20:网络编程(1)
			
什么是计算机网络? 指的是分布在不同地域的计算机,通过外部设备连接起来,实现资源共享与数据传输的计算机系统. 通信三要素: IP: IP地址 Internet上的每台主机(Host)都有一个唯一的IP ...
 - 【Python】【Django】登录用户-链接Mysql
 - UVA - 12186 Another Crisis(工人的请愿书)(树形dp)
			
题意:某公司有1个老板和n(n<=105)个员工组成树状结构,除了老板之外每个员工都有唯一的直属上司.老板的编号为0,员工编号为1~n.无下属的员工(叶子)打算签署一项请愿书递给老板,但不能跨级 ...
 - POJ 2187:Beauty Contest 求给定一些点集里最远的两个点距离
			
Beauty Contest Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 31414 Accepted: 9749 D ...
 - Windows环境安装与搭建node.js环境
			
参考文章:https://www.cnblogs.com/zhouyu2017/p/6485265.html 一.下载node.js,直接下一步至安装完成.https://nodejs.org/en/ ...
 - 关于SI522替代FM17522和MFRC522的资料对比
			
以下是SI522与FM17522.MFRC522的对比参数: SI522是完全PIN对PIN软硬件兼容MFRC522.CV520.FM17522,另外我们可提供一对一技术支持解决客户所遇到的问题: 1 ...