您好,登錄后才能下訂單哦!
這篇文章給大家介紹simple JWT身份驗證怎么在DRF項目中使用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
user 模型類:
我user模型類繼承的是django.contrib.auth.models.AbstractUser
,這樣可以使用Django自帶的認(rèn)證。
如果繼承該類,我們就必須在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
:
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
根據(jù)官方文檔的說明,get_token
方法之所以設(shè)置token['name']
是因為程序可能運(yùn)行在集群上,這里不寫也可以。
編寫視圖類:
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 認(rèn)證接口 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的一些自定義設(shè)置包括獲取的token和refresh的生命周期等配置,通過查看rest_framework_simplejwt
的源碼可以發(fā)現(xiàn)有很多自定義配置,感興趣的小伙伴可以通過查看官方文檔了解更多,這里我只配置了獲取的token的生命周期。
啟動程序訪問:
可以發(fā)現(xiàn)返回了三個值:
refresh:是刷新token用的,當(dāng)前端token過期需要刷新token的時候就可以訪問前邊說的api/token/refresh
url,參數(shù)就是refresh的值。
access:這個就是token但是框架里叫做access。
token:這個是在序列化文件中給access新命名了一個值,方便前端獲?。?/p>
def validate(self, attrs): """ 登錄返回token和refresh :param attrs: :return: """ data = super().validate(attrs) data['token'] = str(data["access"]) return data
視圖類:
在視圖類中導(dǎo)入from rest_framework_simplejwt.tokens import RefreshToken
重寫create
方法,需要通過前邊導(dǎo)入的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()
關(guān)于simple JWT身份驗證怎么在DRF項目中使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。