Django JWT认证终端cURL正常但浏览器中失效是什么原因?
问题排查及原因汇总
前端请求未携带Authorization请求头
cURL请求正常是因为你手动添加了Authorization: Bearer <access_token>请求头,React发请求时容易漏配该字段。你可以打开浏览器F12控制台的「网络」标签,查看对应API请求的请求头列表,确认是否存在Authorization字段。如果用axios发请求,要么全局配置axios.defaults.headers.common['Authorization'] =Bearer ${token}``,要么单次请求手动携带该头。跨域场景下CORS配置错误
当前后端端口/域名不一致时属于跨域请求,需要两边都做凭证配置:- Django侧需安装
django-cors-headers,配置CORS_ALLOW_CREDENTIALS = True,同时显式将前端域名加入CORS_ALLOWED_ORIGINS,不能同时开启CORS_ALLOW_ALL_ORIGINS和允许凭证; - 前端侧请求需开启凭证携带:axios配置
withCredentials: true,fetch API配置credentials: 'include'。
- Django侧需安装
JWT凭证存储异常
如果你将token存在localStorage/sessionStorage,打开浏览器「应用」标签检查对应存储位置是否成功写入了登录接口返回的token,排除页面刷新、路由跳转导致token被意外清空的情况。如果用HttpOnly Cookie存储token,要检查Cookie的Domain、Secure、Path属性是否和开发环境匹配:http开发环境不要开启Secure属性,Domain要和前后端域名匹配,否则浏览器不会自动携带Cookie。Django认证类配置优先级错误
检查Django配置文件中REST_FRAMEWORK的DEFAULT_AUTHENTICATION_CLASSES列表,确认rest_framework_simplejwt.authentication.JWTAuthentication配置优先级高于其他冲突的认证类。
"detail": "Authentication credentials were not provided."
内容的提问来源于stack exchange,提问作者silviaa11

