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

Django REST中Token认证失败:已创建用户但凭据验证始终失败

排查Django REST Framework用户认证失败的问题

看起来你遇到了DRF中用户认证始终失败的问题,结合你给出的代码片段,我帮你梳理几个常见的排查方向和修复方案:

1. 检查authenticate函数的参数与请求数据是否匹配

你的ObtainAuthToken的post方法里,直接用request.data['username']取值存在两个潜在问题:

  • 如果请求里没有username字段,会直接抛出KeyError,导致认证流程中断
  • 如果你用了自定义用户模型,可能用户登录的标识是email而非username,这时候用username去认证肯定找不到用户

修复建议:

from django.http import JsonResponse
from rest_framework import status

class ObtainAuthToken(APIView):
    @csrf_exempt
    def post(self, request):
        # 安全获取请求参数,避免KeyError
        username = request.data.get('username')
        password = request.data.get('password')
        
        if not username or not password:
            return JsonResponse(
                {'error': '请提供用户名和密码'}, 
                status=status.HTTP_400_BAD_REQUEST
            )
        
        # 执行认证
        user = authenticate(username=username, password=password)
        
        if user:
            # 用get_or_create兜底,避免信号未触发的情况
            token, created = Token.objects.get_or_create(user=user)
            return JsonResponse({'token': token.key})
        else:
            return JsonResponse(
                {'error': '用户名或密码错误'}, 
                status=status.HTTP_401_UNAUTHORIZED
            )

2. 确认用户创建时密码是否正确哈希

如果创建用户时直接给password字段赋值明文,而非调用user.set_password(明文密码),authenticate会对比失败——因为Django认证系统只识别哈希后的密码。

正确的用户创建方式示例:

user = User.objects.create(username='testuser')
user.set_password('testpass123')  # 必须用该方法哈希密码
user.save()

3. 验证Token生成信号是否生效

你的post_save信号逻辑没问题,但可以手动检查数据库的authtoken_token表,确认对应用户是否有生成的Token记录。如果没有,可能是信号未正确注册:

  • 确保信号所在的models.py对应的App已添加到INSTALLED_APPS中
  • 可以把信号移到signals.py文件,然后在apps.py的ready()方法中导入:
# your_app/apps.py
from django.apps import AppConfig

class YourAppConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'your_app'

    def ready(self):
        import your_app.signals

4. 检查自定义用户模型配置(若使用)

如果你自定义了User模型,必须在settings.py中指定:

AUTH_USER_MODEL = 'your_app.YourCustomUser'

同时要确保自定义模型继承了AbstractBaseUser或AbstractUser,并正确配置了USERNAME_FIELD等必要字段。

5. 确认DRF认证类配置

在settings.py中检查DRF的默认认证类是否包含Token认证:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        # 其他认证类...
    ]
}

按照上述步骤逐一排查,应该能定位到认证失败的根源。

内容的提问来源于stack exchange,提问作者Hari Krishnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:37:49