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

Djoser忽略认证令牌:携带Token请求仍返回403错误

排查步骤与解决方案

1. 检查DRF全局认证配置

确保settings.py中REST_FRAMEWORK的DEFAULT_AUTHENTICATION_CLASSES已包含Token认证类,这是全局生效的基础:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        # 保留其他需要的认证类(如SessionAuth)
    ],
    # 其他DRF配置项
}

2. 确认视图/路由的认证类设置

如果自定义过Djoser的视图或路由,要确保目标视图(比如UserViewSet对应/users/me、TokenLogoutView对应/token/logout)的authentication_classes包含TokenAuthentication:

from rest_framework.authentication import TokenAuthentication
from djoser.views import UserViewSet, TokenLogoutView

class CustomUserViewSet(UserViewSet):
    authentication_classes = [TokenAuthentication]

class CustomTokenLogoutView(TokenLogoutView):
    authentication_classes = [TokenAuthentication]

Djoser默认视图已配置该认证类,但如果被覆盖或自定义路由,需手动确认。

3. 严格校验请求头格式

TokenAuthentication只识别请求头中的凭证,请求体传token无效,且必须保证格式正确:

Authorization: Token {你的令牌字符串}

注意Token与令牌之间必须有一个空格,少空格或拼写错误(比如写成Bearer)都会导致认证失败。

4. 排查中间件对请求头的拦截

如果使用了django-cors-headers等跨域中间件,要确保CORS_ALLOW_HEADERS包含Authorization:

CORS_ALLOW_HEADERS = [
    'authorization',
    # 其他允许的请求头
]

另外检查自定义中间件,确认没有修改或删除request.META中的HTTP_AUTHORIZATION字段——DRF正是从这个字段获取认证凭证的。

5. 验证Token的有效性

进入Django后台查看authtoken_token表:

  • 确认使用的token存在且未被删除
  • 检查token关联的user_id是否为当前用户,避免用错了其他账号的token

6. 检查权限类配置

确保DRF的权限配置没有过于严格,/users/me和/token/logout只需要IsAuthenticated权限:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

如果是视图单独设置权限,也要保证对应视图的permission_classes = [IsAuthenticated]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:05:44