DRF获取Token失败:无法使用提供的凭据登录
问题描述
尝试通过Django REST Framework的api-token-auth接口获取Token时,返回400错误,提示"Unable to log in with provided credentials."。已通过管理后台创建活跃的超级用户和普通用户,且已引入rest_framework和rest_framework.authtoken模块,配置了REST_FRAMEWORK相关参数,项目配置代码如下:
请求命令及返回结果
bigissue@vmi995554:/opt/ftusbrdp/sbin$ http POST http://172.18.0.1:7000/api-token-auth/ username='nicola' password="Password12345" HTTP/1.1 400 Bad Request Allow: POST, OPTIONS Content-Length: 68 Content-Type: application/json Cross-Origin-Opener-Policy: same-origin Date: Tue, 29 Nov 2022 14:19:40 GMT Referrer-Policy: same-origin Server: WSGIServer/0.2 CPython/3.9.15 X-Content-Type-Options: nosniff X-Frame-Options: DENY { "non_field_errors": [ "Unable to log in with provided credentials." ] }
项目配置代码
settings.py
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'appjud', 'rest_framework', 'rest_framework.authtoken' ] REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ), 'DEFAULT_PERMISSION_CLASSES':( 'rest_framework.permissions.IsAuthenticated', ), } DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dbjud', 'USER': 'root', 'PASSWORD': 'Password19', 'HOST':'localhost', 'PORT':'3306', } }
router.py
from appjud.viewsets import userviewsets from rest_framework import routers router = routers.DefaultRouter() router.register('user', userviewsets, basename ='user_api')
serializers.py
class userSerializers(serializers.ModelSerializer): class Meta: model = User fields = '__all__'
viewsets.py
from rest_framework import viewsets from .serializers import userSerializers from django.contrib.auth.models import User class userviewsets(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = userSerializers
urls.py
from django.contrib import admin from django.urls import path, include, re_path from unimiproject.router import router from rest_framework.authtoken import views urlpatterns = [ path('admin/', admin.site.urls), path('api-auth/', include('rest_framework.urls')), re_path(r"^appjud/",include("appjud.urls")), path('api/', include(router.urls)), path('api-token-auth/', views.obtain_auth_token, name='api-token-auth'), ]
解决方案
以下是几个可能的原因及对应解决方法:
未执行Token数据表迁移
虽然已在INSTALLED_APPS中添加rest_framework.authtoken,但如果没运行迁移命令,Django不会创建存储Token的authtoken_token表。执行以下命令:python manage.py migrate密码验证不匹配
- 确认用户名
nicola和密码Password12345完全正确,注意大小写、特殊字符和空格。 - 可以通过Django后台重新设置该用户的密码,确保密码没有输入错误。
- 检查用户密码是否通过Django加密机制存储(管理后台创建的用户会自动加密,其他方式创建可能未正确加密)。
- 确认用户名
用户状态异常
确认用户nicola的is_active字段为True,可以通过Django shell验证:# 进入Django shell执行 from django.contrib.auth.models import User user = User.objects.get(username='nicola') print(user.is_active)如果为
False,修改并保存:user.is_active = True user.save()请求数据格式问题
换用curl命令测试,确保请求数据格式正确:# 表单格式请求 curl -X POST -d "username=nicola&password=Password12345" http://172.18.0.1:7000/api-token-auth/ # JSON格式请求 curl -X POST -H "Content-Type: application/json" -d '{"username":"nicola","password":"Password12345"}' http://172.18.0.1:7000/api-token-auth/自定义用户模型冲突(若存在)
若项目中使用了自定义用户模型,需确保settings.py中已正确配置AUTH_USER_MODEL,否则会导致验证失败。
内容的提问来源于stack exchange,提问作者zabitstack
相关产品推荐
相关产品推荐

