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

Django JWT无法自定义认证返回信息的技术求助

Django JWT自定义认证返回信息解决方案

一、自定义认证成功的返回内容

通过重写JWT的序列化器和视图类,在返回结果中添加自定义字段:

  1. 自定义Token序列化器,继承默认的TokenObtainPairSerializer并扩展返回数据
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        # 调用父类方法获取默认的refresh/access令牌
        data = super().validate(attrs)
        # 添加自定义字段(示例:用户ID、用户名、邮箱)
        user = self.user
        data.update({
            'user_id': user.id,
            'username': user.username,
            'email': user.email
        })
        return data
  1. 自定义视图类,指定使用上述序列化器
from rest_framework_simplejwt.views import TokenObtainPairView

class CustomTokenObtainPairView(TokenObtainPairView):
    serializer_class = CustomTokenObtainPairSerializer
  1. 在urls.py中替换默认的JWT认证路由
from django.urls import path
from .views import CustomTokenObtainPairView

urlpatterns = [
    path('api/token/', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
    # 其他路由...
]

二、自定义认证失败的返回内容

如果需要修改用户名/密码错误等场景的错误提示,有两种实现方式:

方式1:在序列化器中捕获并自定义异常

from rest_framework.exceptions import AuthenticationFailed
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        try:
            data = super().validate(attrs)
        except AuthenticationFailed:
            # 自定义错误信息
            raise AuthenticationFailed(detail="用户名或密码错误,请重新输入", code=401)
        
        # 添加成功返回的自定义字段
        user = self.user
        data['username'] = user.username
        return data

方式2:全局异常处理

  1. 在settings.py中配置自定义异常处理器
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'your_project.utils.custom_exception_handler',
    # 其他原有配置...
}
  1. 在utils.py中实现自定义异常处理逻辑
from rest_framework.views import exception_handler
from rest_framework.exceptions import AuthenticationFailed

def custom_exception_handler(exc, context):
    response = exception_handler(exc, context)
    # 针对认证失败的异常自定义响应
    if isinstance(exc, AuthenticationFailed):
        response.data = {
            'code': 401,
            'message': '登录失败:用户名或密码不匹配',
            'details': exc.detail
        }
    return response

内容的提问来源于stack exchange,提问作者dapao luo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 02:22:37