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

Django REST Framework有效凭证请求返回401错误排查求助

问题分析与解决方案

问题根源

你遇到的401 Invalid token错误,是因为全局配置的TokenAuthentication被应用到了DRF自带的obtain_auth_token视图上。这个视图的作用是通过用户名密码获取Token,但全局认证规则会先检查请求中是否携带合法Token——而你发起请求时只传了用户名密码,没有Token,因此被拦截返回错误。

而Djoser的auth/token/login端点能正常工作,是因为Djoser内部已经为该视图配置了允许匿名访问的权限,不会强制要求请求携带Token。

解决方案

你可以通过自定义获取Token的视图,绕过全局认证规则,让该接口允许匿名访问:

步骤1:自定义认证视图

在restaurant/views.py中添加以下代码:

from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework import permissions

class CustomAuthToken(ObtainAuthToken):
    # 允许匿名用户访问该接口
    permission_classes = [permissions.AllowAny]

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})

步骤2:更新应用级URL配置

修改restaurant/urls.py,替换原来的obtain_auth_token引用:

from django.urls import path
from . import views
# 替换原导入,改用自定义视图
from .views import CustomAuthToken

urlpatterns = [
    path('home/', views.index, name='index'),
    path('menu/', views.MenuItemView.as_view()),
    path('menu/<int:pk>', views.SingleMenuItemView.as_view()),
    path('api-token-auth/', CustomAuthToken.as_view())
]

验证请求

确保你的POST请求满足以下要求:

  • 请求头Content-Type设置为application/json
  • 请求体携带正确的username和password字段:
    {
        "username": "你的用户名",
        "password": "你的密码"
    }
    

这样修改后,restaurant/api-token-auth端点就能正常通过用户名密码返回Token了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:52:42