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 相关文章推荐
巧用Python装饰器 免去调用父类构造函数的麻烦
May 18 Python
Python urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
Python中内建函数的简单用法说明
May 05 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
python生成带有表格的图片实例
Feb 03 Python
python使用pip安装SciPy、SymPy、matplotlib教程
Nov 20 Python
Python pickle模块实现对象序列化
Nov 22 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
Keras 使用 Lambda层详解
Jun 10 Python
python3.7调试的实例方法
Jul 21 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
php 方便水印和缩略图的图形类
2009/05/21 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
用Python进行TCP网络编程的教程
2015/04/29 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
Python读取word文本操作详解
2018/01/22 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python爬虫之遍历单个域名
2019/11/20 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
车间主管岗位职责
2013/11/14 职场文书
公益活动策划方案
2014/01/09 职场文书
农民致富事迹材料
2014/01/23 职场文书
产品售后服务承诺书
2014/05/21 职场文书
教育实习指导教师评语
2014/12/31 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers
MySQL日期时间函数知识汇总
2022/03/17 MySQL
Python采集股票数据并制作可视化柱状图
2022/04/04 Python