温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

simple JWT身份验证怎么在DRF项目中使用

发布时间:2021-01-14 16:12:40 来源:亿速云 阅读:619 作者:Leah 栏目:开发技术

这篇文章给大家介绍simple JWT身份验证怎么在DRF项目中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

登录返回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

simple JWT身份验证怎么在DRF项目中使用

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的生命周期。

启动程序访问:

simple JWT身份验证怎么在DRF项目中使用

simple JWT身份验证怎么在DRF项目中使用

可以发现返回了三个值:

  • 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()

关于simple JWT身份验证怎么在DRF项目中使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI