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

