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
相关产品推荐
相关产品推荐

