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

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'),

]
解决方案

以下是几个可能的原因及对应解决方法:

  1. 未执行Token数据表迁移
    虽然已在INSTALLED_APPS中添加rest_framework.authtoken,但如果没运行迁移命令,Django不会创建存储Token的authtoken_token表。执行以下命令:

    python manage.py migrate
    
  2. 密码验证不匹配

    • 确认用户名nicola和密码Password12345完全正确,注意大小写、特殊字符和空格。
    • 可以通过Django后台重新设置该用户的密码,确保密码没有输入错误。
    • 检查用户密码是否通过Django加密机制存储(管理后台创建的用户会自动加密,其他方式创建可能未正确加密)。
  3. 用户状态异常
    确认用户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()
    
  4. 请求数据格式问题
    换用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/
    
  5. 自定义用户模型冲突(若存在)
    若项目中使用了自定义用户模型,需确保settings.py中已正确配置AUTH_USER_MODEL,否则会导致验证失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:26:27