DRF使用simple JWT身份验证的实现


Posted in Python onJanuary 14, 2021

前言

在Django的前后端分离项目中DRF(Django Restframe Work)框架无疑是首选,关于token验证一般使用的是JWT,但是JWT只支持到Django1.x的版本。

官方推荐Django2.x之后的版本使用simple JWT,官方文档。

登录返回token和refresh

user 模型类:

我user模型类继承的是django.contrib.auth.models.AbstractUser,这样可以使用Django自带的认证。

如果继承该类,我们就必须在settings中配置 AUTH_USER_MODEL = "users.UserProfile"

from datetime import datetime

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class UserProfile(AbstractUser):
  """
  用户
  """
  name = models.CharField(max_length=30, null=True, blank=True, verbose_name="姓名")
  birthday = models.DateField(null=True, blank=True, verbose_name="出生年月")
  gender = models.CharField(max_length=6, choices=(("male", u"男"), ("female", "女")), default="female", verbose_name="性别")
  mobile = models.CharField(null=True, blank=True, max_length=11, verbose_name="电话")
  email = models.CharField(max_length=100, null=True, blank=True, verbose_name="邮箱")

  class Meta:
    verbose_name = "用户"
    verbose_name_plural = "用户"

  def __str__(self):
    return self.username

序列化文件:

注意这里使用的User是Django管理的user模型类,要从django.contrib.auth.get_user_model实例化获取。

users模块的serializers.py文件中写如下序列化类继承自rest_framework_simplejwt.serializers.TokenObtainPairSerializer

DRF使用simple JWT身份验证的实现

from django.contrib.auth import get_user_model
User = get_user_model()

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
  @classmethod
  def get_token(cls, user):
    token = super().get_token(user)
    token['name'] = user.username
    return token

  def validate(self, attrs):
    """
    登录返回token和refresh
    :param attrs:
    :return:
    """
    data = super().validate(attrs)
    data['token'] = str(data["access"])
    return data

根据官方文档的说明,get_token方法之所以设置token['name']是因为程序可能运行在集群上,这里不写也可以。

编写视图类

from users.serializers import MyTokenObtainPairSerializer

class MyTokenObtainPairView(TokenObtainPairView):
  serializer_class = MyTokenObtainPairSerializer

编写url:

其中api/token/api/token/refresh/两个URL是simple JWT自带的token方法:

  • api/token/用于获取token
  • api/token/refresh/用于刷新token
from django.conf.urls import url
from django.urls import include, path

from rest_framework_simplejwt.views import (
  TokenObtainPairView,
  TokenRefreshView,
)

urlpatterns = [
  # simple jwt 认证接口
  path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
  path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
  path('login/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

settings配置SIMPLE_JWT:

这是对token的一些自定义设置包括获取的token和refresh的生命周期等配置,通过查看rest_framework_simplejwt的源码可以发现有很多自定义配置,感兴趣的小伙伴可以通过查看官方文档了解更多,这里我只配置了获取的token的生命周期。

启动程序访问:

DRF使用simple JWT身份验证的实现

DRF使用simple JWT身份验证的实现

可以发现返回了三个值:

  • refresh:是刷新token用的,当前端token过期需要刷新token的时候就可以访问前边说的api/token/refreshurl,参数就是refresh的值。
  • access:这个就是token但是框架里叫做access。
  • token:这个是在序列化文件中给access新命名了一个值,方便前端获取:
def validate(self, attrs):
  """
  登录返回token和refresh
  :param attrs:
  :return:
  """
  data = super().validate(attrs)
  data['token'] = str(data["access"])
  return data

注册返回token

视图类:

  • 在视图类中导入from rest_framework_simplejwt.tokens import RefreshToken
  • 重写create方法,需要通过前边导入的RefreshToken来获取token返回给前端。
from django.contrib.auth import get_user_model
from django.db.models import Q
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.mixins import CreateModelMixin
from rest_framework import viewsets
from rest_framework import status

from users.serializers import (
  UserRegSerializer
)
from .models import VerifyCode

User = get_user_model()


class UserViewSet(CreateModelMixin, viewsets.GenericViewSet):
  """
  用户
  """
  serializer_class = UserRegSerializer
  queryset = User.objects.all()

  def create(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = self.perform_create(serializer)

    ret_dict = serializer.data
    refresh = RefreshToken.for_user(user)
    access_token = str(refresh.access_token)
    ret_dict["token"] = access_token

    headers = self.get_success_headers(serializer.data)
    return Response(ret_dict, status=status.HTTP_201_CREATED, headers=headers)

  def perform_create(self, serializer):
    return serializer.save()

到此这篇关于DRF使用simple JWT身份验证的实现的文章就介绍到这了,更多相关DRF使用simple JWT身份验证内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Django卸载之后重新安装的方法
Mar 15 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python爬取成语接龙类网站
Oct 19 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 Python
带你认识Django
Jan 15 Python
python对象与json相互转换的方法
May 07 Python
通过cmd进入python的实例操作
Jun 26 Python
Python 使用list和tuple+条件判断详解
Jul 30 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
如何用Python提取10000份log中的产品信息
Jan 14 #Python
python自动生成证件号的方法示例
Jan 14 #Python
用python批量移动文件
Jan 14 #Python
python用700行代码实现http客户端
Jan 14 #Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 #Python
Django扫码抽奖平台的配置过程详解
Jan 14 #Python
如何用python实现一个HTTP连接池
Jan 14 #Python
You might like
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
php中namespace及use用法分析
2016/12/06 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
详解PHP队列的实现
2019/03/14 PHP
JavaScript中常见陷阱小结
2010/04/27 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
js修改原型的属性使用介绍
2014/01/26 Javascript
jQuery实现当前页面标签高亮显示的方法
2015/03/10 Javascript
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
2016/12/08 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
js简单实现网页换肤功能
2017/04/07 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
angular 服务随记小结
2019/05/06 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python通过DOM和SAX方式解析XML的应用实例分享
2015/11/16 Python
python图书管理系统
2020/04/05 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python groupby 函数 as_index详解
2019/12/16 Python
python学生管理系统的实现
2020/04/05 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
中国双语服务优势的在线购票及活动平台:247tickets
2018/10/26 全球购物
法律专业自我鉴定
2013/10/03 职场文书
计算机工程学院个人求职信
2013/10/05 职场文书
我为自己代言广告词
2014/03/18 职场文书
廉洁教育学习材料
2014/05/19 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
社区党支部承诺书
2015/04/29 职场文书
教师研修随笔感言
2015/11/18 职场文书
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript