后端采用Djoser认证,Angular请求/account/me/返回401未授权错误
解决Angular调用Djoser /account/me/ 401未授权问题
Postman能正常请求但Angular客户端返回401,核心问题基本出在请求头传递或跨域配置上,咱们一步步排查解决:
1. 先确认Authorization头格式是否正确
Djoser默认采用Token认证,Authorization头的格式必须是 Token <你的token值>——注意Token后面必须有一个空格!你可以在Angular代码里加个日志,确认头的格式:
// 打印请求头验证格式 const token = localStorage.getItem('auth_token'); // 假设你把Token存在localStorage里 const headers = new Headers({ 'Content-Type': 'application/json', 'Authorization': `Token ${token}` }); console.log('当前请求头:', headers);
2. 检查Angular是否正确携带了认证头
不同版本的Angular Http模块写法有差异,要确保头被正确传入请求配置:
老版本Http模块写法
import { Http, Headers, RequestOptions } from '@angular/http'; // 服务中的请求方法 getUserProfile() { const token = localStorage.getItem('auth_token'); const headers = new Headers({ 'Content-Type': 'application/json', 'Authorization': `Token ${token}` }); const options = new RequestOptions({ headers: headers }); return this.http.get(homeUrls.me, options) .map(res => res.json()); }
新版本HttpClient模块写法
import { HttpClient, HttpHeaders } from '@angular/common/http'; // 服务中的请求方法 getUserProfile() { const token = localStorage.getItem('auth_token'); const headers = new HttpHeaders({ 'Content-Type': 'application/json', 'Authorization': `Token ${token}` }); return this.http.get(homeUrls.me, { headers: headers }); }
3. 排查跨域(CORS)配置问题
Postman不受浏览器同源策略限制,但Angular在浏览器中运行会受影响。如果前后端域名不同,需要在Django后端配置CORS允许携带认证头:
- 先安装依赖:
pip install django-cors-headers - 在
settings.py中添加配置:
INSTALLED_APPS = [ ... 'corsheaders', ... ] MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', # 要放在CommonMiddleware前面 'django.middleware.common.CommonMiddleware', ... ] # 生产环境建议指定具体域名,这里先允许所有来源测试 CORS_ALLOW_ALL_ORIGINS = True # 允许携带认证凭证(关键!) CORS_ALLOW_CREDENTIALS = True # 允许的请求头列表 CORS_ALLOW_HEADERS = [ 'Authorization', 'Content-Type', ... ]
4. 验证Token是否有效
你可以把Angular当前使用的Token复制到Postman里测试,如果Postman也返回401,说明Token已经过期或无效,需要重新登录获取新的Token。
5. 确认Djoser的后端认证配置
确保Django的settings.py中已经配置了正确的认证类:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ... ), }
并且已经执行过python manage.py migrate来创建Token数据表。
最后建议你打开浏览器开发者工具的Network标签,查看Angular发送的请求详情——直接看实际请求头里有没有Authorization字段,以及字段值是否正确,这是最直接的排查方式!
内容的提问来源于stack exchange,提问作者Shoaib Iqbal
相关产品推荐
相关产品推荐

