gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章DRF使用simple JWT身份验证的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言

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

最后此篇关于DRF使用simple JWT身份验证的实现的文章就讲到这里了,如果你想了解更多关于DRF使用simple JWT身份验证的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com