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中optparse模块使用浅析
Jan 01 Python
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
在Python的Django框架中编写编译函数
Jul 20 Python
Python 调用Java实例详解
Jun 02 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
Python3实现获取图片文字里中文的方法分析
Dec 13 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
django rest framework 实现用户登录认证详解
Jul 29 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
python列表推导式操作解析
Nov 26 Python
Python partial函数原理及用法解析
Dec 11 Python
python PIL模块的基本使用
Sep 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中include()与require()的区别说明
2010/03/10 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
JS判断字符串长度的5个方法(区分中文和英文)
2014/03/18 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
移动端界面的适配
2017/01/11 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
vue项目打包后怎样优雅的解决跨域
2019/05/26 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[01:01:18]VP vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[49:11]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第二场 12.20
2020/12/23 DOTA
Python Socket编程入门教程
2014/07/11 Python
Python匹配中文的正则表达式
2016/05/11 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
2019/08/09 Python
pygame实现俄罗斯方块游戏(基础篇3)
2019/10/29 Python
python能做哪方面的工作
2020/06/15 Python
运动会闭幕式解说词
2014/02/21 职场文书
风险评估实施方案
2014/03/09 职场文书
倡议书范文
2014/04/16 职场文书
植树造林的宣传标语
2014/06/23 职场文书
理财学专业自荐书
2014/06/28 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript