Angular向本地Django服务器发POST请求出现403错误排查
Angular向Django发送POST请求返回403的原因及解决方法
1. Token传递方式不匹配
你的Angular代码将JWT放在Authorization请求头中:
const headers = new HttpHeaders({ 'Content-Type':'application/json', 'Authorization': 'Bearer' + token // 注意:Bearer与token之间缺少空格 });
但Django后端是从Cookie中读取token:
token = request.COOKIES.get('jwt')
Postman能正常工作,大概率是你在Postman中把JWT放到了Cookie里,而Angular是放在Header中,后端拿不到token直接返回未认证(403)。
解决方法:
- 方案一:修改Angular逻辑,将token存入Cookie,并确保请求携带凭证;
- 方案二:修改Django后端,从Authorization头解析token:
auth_header = request.headers.get('Authorization') if not auth_header or not auth_header.startswith('Bearer '): raise AuthenticationFailed('Unauthenticated') token = auth_header.split(' ')[1]
同时修正Angular中Authorization头的格式,在Bearer和token之间添加空格。
2. Angular请求未携带凭证(Cookie)
如果认证依赖Cookie传递token,Angular发送请求时必须显式开启withCredentials,否则浏览器会自动忽略Cookie,即使CORS配置允许凭证也无效。
解决方法:
在Angular的Http请求中添加withCredentials: true:
return this.http.get<any>(this.apiUrl_User, { headers, withCredentials: true })
3. ALLOWED_HOSTS拼写错误
你的Django配置中ALLOWED_HOSTS里的locallhost多了一个字母l,正确写法是localhost。虽然当前CORS_ORIGIN_ALLOW_ALL = True可能暂时不影响,但该错误可能导致后续部署或其他请求异常,建议修正:
ALLOWED_HOSTS = [ "http://localhost:4200", "127.0.0.1" ]
4. POST请求的CSRF令牌校验问题
针对你提到的POST请求场景:Django默认会对POST请求校验CSRF令牌,Postman因无浏览器环境或手动跳过校验能正常请求,但Angular请求未携带CSRF令牌时会返回403。
解决方法:
- 若后端为纯API服务,可在对应视图上添加
@csrf_exempt装饰器跳过校验; - 若需保留CSRF校验,让Angular从Cookie中读取
csrftoken,并放到请求头X-CSRFToken中携带。
内容的提问来源于stack exchange,提问作者Zhad1k
相关产品推荐
相关产品推荐

