Django+Angular应用仅在部署阶段出现401 HTTP错误
部署后django-rest-knox认证返回401的排查与解决方案
按问题发生概率从高到低依次排查:
- Apache未正确转发Authorization请求头(最高发原因)
Apache默认会剥离前端请求携带的Authorization头部,导致Knox无法读取到token完成校验。
解决方法:- 打开站点对应的Apache配置文件(路径一般为
/etc/apache2/sites-available/下的对应.conf文件) - 在
<Directory>配置块内添加配置项:WSGIPassAuthorization On - 重启Apache服务生效:
sudo systemctl restart apache2
可先在后端接口打印request.META.get("HTTP_AUTHORIZATION")确认,如果返回None,直接套用上述配置即可。
- 打开站点对应的Apache配置文件(路径一般为
- CORS配置缺失认证头支持
本地开发阶段CORS限制较松,线上如果未校准配置会导致认证头被跨域规则拦截:- 检查Django配置中的
CORS_ALLOW_HEADERS列表,必须显式包含authorization字段 - 确认
CORS_ALLOW_CREDENTIALS = True未被误设为False - 检查Angular端请求配置,确认跨域请求已开启
withCredentials: true,否则默认不会携带认证头
- 检查Django配置中的
- 域名白名单配置不匹配
本地运行使用localhost时不会触发域名限制,线上环境需要确认:settings.py中的ALLOWED_HOSTS已加入线上实际访问的域名/公网IPCORS_ALLOWED_ORIGINS已完整配置前端访问的实际地址,注意协议(HTTP/HTTPS)要完全匹配,不要写错
- Knox token校验不匹配
已确认admin面板存在token的前提下,进一步排查:- 确认线上环境的
SECRET_KEY未被重置:Knox的token哈希和服务端SECRET_KEY绑定,如果线上和本地的SECRET_KEY不一致,相同token字符串也会校验失败 - 确认线上使用独立的数据库,不要直接复用本地的token:本地数据库的token存储到线上库时会因为哈希规则不匹配失效
- 检查Angular端的token存储逻辑:如果之前用localStorage存储localhost的token,切换线上域名后会出现读取不到token的问题,导致请求携带空的认证头
- 确认线上环境的
- HTTPS配置不兼容
若线上启用HTTPS而本地为HTTP运行模式,需要补充以下配置:settings.py中添加SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),告知Django请求已通过代理完成HTTPS校验- 排查前端是否存在混合内容拦截:HTTPS页面发起HTTP API请求会被浏览器直接拦截,导致认证头无法正常传递
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

