You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:27:09