如何在CustomTokenObtainPairView生成的Token中添加用户名?
解决方法:用CustomTokenObtainPairView生成含用户名的JWT Token
首先你当前代码的问题在于直接调用CustomTokenObtainPairView.post(request=request.data)是错误的——视图的post方法需要接收HttpRequest对象,而不是字典格式的request.data。下面是正确的实现步骤:
1. 先自定义Token序列化器和视图
要让生成的JWT包含用户名,需要重写TokenObtainPairSerializer的get_token方法,把用户名添加到token的payload中:
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from rest_framework_simplejwt.views import TokenObtainPairView class CustomTokenObtainPairSerializer(TokenObtainPairSerializer): @classmethod def get_token(cls, user): # 调用父类方法获取基础token token = super().get_token(user) # 把用户名添加到token的payload字段里 token['username'] = user.username return token # 自定义视图使用上面的序列化器 class CustomTokenObtainPairView(TokenObtainPairView): serializer_class = CustomTokenObtainPairSerializer
2. 在你的业务视图中正确生成Token
不要直接调用视图的post方法,而是直接使用自定义的序列化器来处理账号密码、生成Token,这样更符合DRF的规范:
from rest_framework.response import Response # 导入上面定义的自定义序列化器 from .serializers import CustomTokenObtainPairSerializer # 你的业务视图逻辑部分 if user.check_password(password): # 用序列化器验证账号密码并生成Token serializer = CustomTokenObtainPairSerializer(data={ 'username': username, 'password': password }) # 验证失败会自动抛出异常,也可以自己处理 serializer.is_valid(raise_exception=True) token_data = serializer.validated_data # 构造响应并设置Cookie response = Response() response.set_cookie( key='jwt', value=token_data['access'], httponly=True, secure=True ) response.data = { 'access': token_data['access'] } return response else: return Response({'message': 'Wrong password!'}, status=400)
补充:你之前手动生成Token的代码其实是可行的
如果只是手动生成Token失败,可能是后续验证或返回环节的问题,这段代码本身是正确的:
refresh = RefreshToken.for_user(user) refresh.access_token['username'] = user.username token = str(refresh.access_token)
你可以在生成后打印token,用JWT解析工具查看payload里是否包含username字段,排查是不是后续处理的问题。
内容的提问来源于stack exchange,提问作者Sk09
相关产品推荐
相关产品推荐

