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 命令行参数sys.argv
Sep 06 Python
python有证书的加密解密实现方法
Nov 19 Python
Python多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
举例讲解如何在Python编程中进行迭代和遍历
Jan 19 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
opencv python 傅里叶变换的使用
Jul 21 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
Python制作动态字符图的实例
Jan 27 Python
Python matplotlib实时画图案例
Apr 23 Python
详解Java中一维、二维数组在内存中的结构
Feb 11 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
php下MYSQL limit的优化
2008/01/10 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
php桥接模式应用案例分析
2019/10/23 PHP
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
vue自定义全局共用函数详解
2018/09/18 Javascript
express.js中间件说明详解
2019/03/19 Javascript
vue路由插件之vue-route
2019/06/13 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
Vue v-bind动态绑定class实例方法
2020/01/15 Javascript
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
Python json格式化打印实现过程解析
2020/07/21 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
经典导游欢迎词大全
2014/01/16 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书