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中遍历文件的3个方法
Sep 02 Python
Python生成密码库功能示例
May 23 Python
利用Python代码实现数据可视化的5种方法详解
Mar 25 Python
详解Python发送email的三种方式
Oct 18 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
python多线程分块读取文件
Aug 29 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
Jul 05 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
如何使用 Flask 做一个评论系统
Nov 27 Python
python 实现socket服务端并发的四种方式
Dec 14 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网站提速三大“软”招
2006/10/09 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
php include类文件超时问题处理
2015/02/06 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
Anaconda2 5.2.0安装使用图文教程
2018/09/19 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
Django和Flask框架优缺点对比
2019/10/24 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
Python下载的11种姿势(小结)
2020/11/18 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
迪斯尼商品官方网站:ShopDisney
2016/08/01 全球购物
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
德国购买健身器材:AsVIVA
2017/08/09 全球购物
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
实习教师自我鉴定
2013/12/12 职场文书
《老王》教学反思
2014/02/23 职场文书
暑期培训班招生方案
2014/08/26 职场文书
领导班子对照检查材料
2014/09/22 职场文书
护理见习报告范文
2014/11/03 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电