使用Django+Djoser登出销毁Token遇401未授权错误求助
1. Token格式与有效性检查
- 先在前端控制台打印
GlobalState.userToken,确认值是否为空、是否带多余空格或特殊字符。如果userToken本身开头有空格,拼接后会变成Token xxx(两个空格),导致认证格式错误。 - 验证Token是否已过期或被提前销毁:可以用这个Token请求其他需要认证的接口,比如用户信息接口,如果同样返回401,说明Token本身无效。
2. 请求头缺失CSRF Token
Django默认对POST请求做CSRF验证,你的请求没携带CSRF Token会直接触发401。解决方式:
- 从Cookie中读取
csrftoken值,添加到请求头:
const csrfToken = document.cookie.split('; ').find(row => row.startsWith('csrftoken=')).split('=')[1]; const response = await fetch('http://127.0.0.1:8000/api-auth/token/logout/', { method: 'POST', headers: { 'Authorization': 'Token '.concat(GlobalState.userToken), 'Content-Type': 'application/json', 'X-CSRFToken': csrfToken }, credentials: 'include' // 跨域场景下需要携带Cookie });
3. 后端认证配置问题
- 确认logout视图是否启用了Token认证:如果是自定义视图,需要在类或函数上配置
authentication_classes = [TokenAuthentication];如果用第三方库的视图,检查是否正确继承了认证类。 - 检查urls.py中
/api-auth/token/logout/的路由映射是否正确,有没有拼写错误,或者是否映射到了错误的视图函数。
4. 跨域配置遗漏
如果前后端是不同端口/域名,需确保后端配置了CORS:
- 安装并配置
django-cors-headers,在settings.py中设置:
CORS_ALLOW_CREDENTIALS = True CORS_ALLOW_HEADERS = [ 'authorization', 'x-csrftoken', 'content-type', ] CORS_ALLOWED_ORIGINS = [ 'http://你的前端域名:端口', ]
内容的提问来源于stack exchange,提问作者Simao
相关产品推荐
相关产品推荐

