上篇文件整理下基本的使用,默认响应返回只有 access和refresh这2个字段,如果需要其他字段,则需要自定义序列化类。
1、自定义序列化类,继承TokenObtainPairSerializer
class MyTokenSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
"""
此方法往token的有效负载 payload 里面添加数据
若自定义了用户表,可以在这里面添加用户邮箱,性别,年龄等可以公开的信息
这部分放在token里面是可以被解析的,所以不要放比较私密的信息
:param user: 用戶信息
:return: token
"""
token = super().get_token(user)
# 添加个人信息
token['name'] = user.username
token['mobile'] = user.mobile
return token
def validate(self, attrs):
'''此方法是 响应数据结构,默认返回只有 access 和 refresh'''
data = super().validate(attrs=attrs)
# 获取Token对象
refresh = self.get_token(self.user)
data["refresh"] = str(refresh)
data["access"] = str(refresh.access_token)
# 令牌到期时间
data['expire'] = refresh.access_token.payload['exp'] # 有效期
# 用户名
data['username'] = self.user.username
# 手机号
data['mobile'] = self.user.mobile
return data
2、配置路由
urlpatterns = [
# 验证返回自定义数据url
path('login2/', views.Login2View.as_view()),
# 验证解析paylod数据url
path('test/', views.Test.as_view()),
]
3、配置视图
from rest_framework_simplejwt.views import TokenViewBase, TokenObtainPairView
from vueshop.my_token_serializer import MyTokenSerializer
class Login2View(TokenObtainPairView):
# 引用上面自定义的序列化类
serializer_class = MyTokenSerializer
class Test(APIView):
# permission_classes = []
def get(self, request):
print(request.auth.payload)
return Response('aa')
4、验证
参照上面代码,自行定义自己需要的数据和格式
{
'token_type': 'access',
'exp': 1652948487,
'iat': 1652862087,
'jti': '40b600b04fcd4ee9808d05d1f932bbef',
'user_id': 1,
'name': 'admin',
'mobile': '19856226325'
}
可以根据request.auth.payload获取访问的用户的相关信息,因为是可以解密的,故不要放私密信息。