前言:由于djangorestframework-jwt模块已经不再维护,所以Django新版本也放弃了对他的支持,改用了djangorestframework-simplejwt,simplejwt和jwt在使用上有不小的区别,这里介绍它的基本使用,笔者使用的Django版本是4.2
官方网址:Simple JWT — Simple JWT 5.2.2.post30+gfaf92e8 documentation
1. 安装
pip install djangorestframework-simplejwt
2. 配置
在配置文件中添加以下配置
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
...
}
SIMPLE_JWT = {
# token有效时长(返回的 access 有效时长)
'ACCESS_TOKEN_LIFETIME': datetime.timedelta(seconds=120),
# token刷新的有效时间(返回的 refresh 有效时长)
'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1),
}
然后就可以配置路由使用了
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
...
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
...
]
3. 自定义认证返回的响应格式
由于默认的认证模块只会返回access和refresh两个字段,在登录中并不满足我们的需求,需要添加指定的字段,例如username和id,所以我们选择重写序列化类
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
# 自定义token返回格式
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
data = super().validate(attrs)
res_data = {
"token": data,
'id': self.user.id,
'username': self.user.username
}
return res_data
这里我添加了id和username两个字段,可以根据自己的需求定制
然后配置序列化器
这里的值是你序列化类所在的位置
"TOKEN_OBTAIN_SERIALIZER": "user.serializers.MyTokenObtainPairSerializer",
发送请求进行测试:成功!!!