You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Axios携带Bearer Token调用接口遇401未授权错误求助

排查Axios请求返回401未授权的常见原因与解决方法

我看你用Axios配置了Bearer Token访问后端路由,但一直收到401未授权响应,这种情况我之前开发时也遇到过,咱们一步步来排查可能的问题:

1. 先确认Token本身的有效性

首先要排除Token本身的问题,别在请求配置上瞎忙活。你可以用Postman或者curl直接调用目标接口,带上完全相同的Authorization头,看看结果:

curl -H "Authorization: Bearer f4eaa1ff05046c01" http://localhost/rocourt/01-Backend/api/v1/public/adresses/1

如果Postman/curl也返回401,那基本可以确定是Token的问题——要么过期了,要么权限不够,或者后端生成Token的逻辑和你使用的不匹配,这时候得去后端确认Token的有效性、权限范围和有效期。

2. 检查Axios的请求头是否正确携带

有时候Axios实例的全局headers配置可能不会生效,比如被后续的请求配置覆盖,或者拦截器影响。可以试试两种方式验证:

方式一:在请求拦截器里统一设置头

把Token的设置放到请求拦截器里,确保每个请求都能带上:

import axios from 'axios';
export const HTTP = axios.create({
  baseURL: `http://localhost/rocourt/01-Backend/api/v1/public/`
});

// 添加请求拦截器,确保每次请求都带上Authorization头
HTTP.interceptors.request.use(config => {
  config.headers.Authorization = 'Bearer f4eaa1ff05046c01';
  return config;
}, error => {
  return Promise.reject(error);
});

方式二:在单个请求里显式指定headers

暂时绕过实例的全局配置,直接在get请求里写headers,看看是不是实例配置的问题:

HTTP.get(`adresses/1`, {
  headers: { Authorization: 'Bearer f4eaa1ff05046c01' }
})
.then(response => {
  this.posts = response.data;
})
.catch(e => {
  this.errors.push(e)
})

3. 验证后端的权限与头解析逻辑

  • 确认/adresses/1这个接口是否真的需要Bearer Token?有没有可能后端把这个接口设为公开接口,但你多余加了Token反而触发了校验?
  • 检查后端对Authorization头的解析规则:比如是否严格要求Bearer后面必须有空格(你现在的写法是对的,但有些后端可能有大小写要求,比如必须是Bearer而不是bearer)?
  • 如果后端用了框架(比如Laravel、Spring Boot),检查框架的权限中间件是否正确配置,有没有把这个接口排除在权限校验外,或者你的Token没有对应的访问权限。

4. 排查跨域导致的请求头丢失

如果前端和后端是跨域部署(哪怕是localhost的不同端口),浏览器会发送OPTIONS预检请求,这时候如果后端的CORS配置没有允许Authorization头,浏览器会拦截实际的请求头,导致后端拿不到Token。你需要检查后端的CORS设置,确保Access-Control-Allow-Headers包含Authorization字段。

5. 查看浏览器实际发送的请求

打开浏览器开发者工具的Network面板,找到这个GET请求,查看Request Headers里的Authorization是否真的存在。如果这里看不到这个头,那就是前端配置的问题;如果能看到,那问题肯定在后端的校验逻辑上。

如果以上步骤都排查完还是解决不了,建议让后端同事帮忙看一下接口的请求日志,看看后端实际收到的请求头是什么样的,有没有正确解析到Token——有时候日志会暴露很多前端看不到的细节。

内容的提问来源于stack exchange,提问作者Centauri_a

火山引擎 最新活动