Django REST Framework生产环境Token认证失败问题咨询
排查生产环境Djoser /auth/me/ 401未授权问题
这种生产环境下的认证问题我碰过好多次,基本都是本地和生产的配置差异导致的,给你梳理几个核心排查方向:
确认认证后端与DRF配置
检查settings.py里的AUTHENTICATION_BACKENDS,确保包含django.contrib.auth.backends.ModelBackend(Djoser依赖的默认后端)。同时在REST_FRAMEWORK的DEFAULT_AUTHENTICATION_CLASSES中,要加上你使用的认证类——比如用JWT的话,得有rest_framework_simplejwt.authentication.JWTAuthentication。本地可能默认配置正确,但生产环境的配置文件可能漏了这些项。CORS跨域配置检查
如果前端和后端域名不同,生产环境必须正确配置CORS:- 确保安装了
django-cors-headers,并在INSTALLED_APPS和中间件中添加(中间件要放在django.middleware.common.CommonMiddleware之前); - 设置
CORS_ALLOW_CREDENTIALS = True,允许携带认证凭证; - 在
CORS_ALLOWED_ORIGINS中添加前端的完整域名(比如https://your-frontend-domain.com),不要用通配符,避免安全问题。
跨域配置错误会导致请求头里的token无法被正确携带,直接触发401。
- 确保安装了
HTTPS与反向代理配置
如果生产环境用了HTTPS和反向代理(比如Nginx):- 在Django的
settings.py中设置SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),让Django识别代理传递的HTTPS请求; - 开启
SESSION_COOKIE_SECURE = True和CSRF_COOKIE_SECURE = True,确保cookie仅通过HTTPS传输; - 检查反向代理的配置,比如Nginx要添加
proxy_set_header Authorization $http_authorization;,否则请求中的token会被丢弃,后端拿不到认证信息。
- 在Django的
JWT/认证凭证相关配置
如果用JWT认证:- 确认
SIMPLE_JWT配置中的AUTH_HEADER_TYPES(默认是['Bearer']),前端请求的Authorization头必须对应这个前缀(比如Bearer your-token-string); - 检查token的有效期,生产环境如果token过期也会返回401,但你说本地正常,这个概率低,但可以排查下。
- 确认
Djoser权限配置
查看settings.py中的DJOSER配置,确保PERMISSIONS里的me权限设置正确:DJOSER = { # 其他配置... 'PERMISSIONS': { 'me': ['djoser.permissions.CurrentUserOrAdmin'], }, }这个配置确保只有当前登录用户或管理员能访问
/auth/me/,如果配置错误可能导致正常请求被拦截。
先从CORS和反向代理的请求头传递开始排查,这两个是生产环境最容易踩的坑,再逐步检查其他配置项。
内容的提问来源于stack exchange,提问作者Adrian Lopez
相关产品推荐
相关产品推荐

