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抓取网页内容示例分享
Feb 24 Python
Python中装饰器的一个妙用
Feb 08 Python
Python中编写ORM框架的入门指引
Apr 29 Python
介绍Python中的fabs()方法的使用
May 14 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
Python使用OpenCV进行标定
May 08 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 Python
Python内置加密模块用法解析
Nov 25 Python
Python使用pymysql模块操作mysql增删改查实例分析
Dec 19 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 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+SQL 注入攻击的技术实现以及预防办法
2011/01/27 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
js获取时间精确到秒(年月日)
2016/03/16 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
python二维键值数组生成转json的例子
2019/12/06 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
工程部经理岗位职责
2013/12/08 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
公司员工安全协议书
2014/11/21 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
餐厅开业活动方案
2019/07/08 职场文书
Nginx快速入门教程
2021/03/31 Servers
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python