服务器之家

服务器之家 > 正文

DRF使用simple JWT身份验证的实现

时间:2021-08-25 00:21     来源/作者:一切如来心秘密

前言

在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"

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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身份验证的实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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']是因为程序可能运行在集群上,这里不写也可以。

编写视图类

?
1
2
3
4
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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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新命名了一个值,方便前端获取:
?
1
2
3
4
5
6
7
8
9
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返回给前端。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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身份验证内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_42586468/article/details/112524452

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部