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中模拟enum枚举类型的5种方法分享
Nov 22 Python
Python yield 使用浅析
May 28 Python
Python中的数学运算操作符使用进阶
Jun 20 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
Python队列的定义与使用方法示例
Jun 24 Python
Python进程间通信之共享内存详解
Oct 30 Python
Python对excel文档的操作方法详解
Dec 10 Python
Python整数对象实现原理详解
Jul 01 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
对tensorflow中cifar-10文档的Read操作详解
Feb 10 Python
如何使用python记录室友的抖音在线时间
Jun 29 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 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
几个有趣的Javascript Hack
2010/07/24 Javascript
一个javascript图片阅览组件
2010/11/09 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
分公司负责人任命书
2014/06/04 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
药店营业员岗位职责
2015/04/14 职场文书
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js
JavaScript实现简单的音乐播放器
2022/08/14 Javascript