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的Twisted框架编写简单的网络客户端
Apr 16 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
python对json的相关操作实例详解
Jan 04 Python
Python数据结构之翻转链表
Feb 25 Python
Python实现时钟显示效果思路详解
Apr 11 Python
基于树莓派的语音对话机器人
Jun 17 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
python 进程的几种创建方式详解
Aug 29 Python
Java文件与类动手动脑实例详解
Nov 10 Python
python logging添加filter教程
Dec 24 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 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
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
九种原生js动画效果
2015/11/11 Javascript
jQuery+Pdo编写login登陆界面
2016/08/01 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
python基础while循环及if判断的实例讲解
2017/08/25 Python
Python实现抢购IPhone手机
2018/02/07 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
syb养殖创业计划书
2014/01/09 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
初一学生评语大全
2014/04/24 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
发展党员工作情况汇报
2014/10/28 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
理解深度学习之深度学习简介
2021/04/14 Python