You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Passport授权后Axios默认Bearer头不生效,求解决方案

解决Laravel Passport客户端凭证模式下Axios请求头缺失Bearer Token的问题

我来帮你搞定这个问题!你已经成功拿到token了,说明授权流程本身没问题,问题大概率出在Axios默认头的设置时机或者方式上,我给你分析几个常见原因和对应的解决方案:

1. 检查是否使用了自定义Axios实例

很多Vue项目会创建自定义的Axios实例(比如封装在src/utils/request.js里),而不是直接用全局的axios对象。如果是这种情况,你设置axios.defaults.headers.common是不会对自定义实例生效的。

举个例子,如果你是这样创建的实例:

// src/utils/request.js
const api = axios.create({
  baseURL: '/api'
})

export default api

那你应该给这个api实例设置请求头,而不是全局的axios:

async function getToken() {
  const resp = await axios.post("/oauth/token", {
    "client_id": 7,
    "client_secret": "2GmvfxQev7AnUyfq0Srz4jJaMQyWSt1iVZtukRR6",
    "grant_type": "client_credentials",
    "scope": "*"
  });
  return resp.data.access_token;
}

getToken().then((token) => {
  api.defaults.headers.common["Authorization"] = `Bearer ${token}`;
})

2. 用请求拦截器替代一次性设置默认头

你的原始写法是页面加载时一次性获取token并设置默认头,但如果后续请求在token设置完成前就发起(比如组件的created钩子直接发请求),就会出现头缺失的情况。请求拦截器是更可靠的方案,它会在每次请求发起前动态检查并设置token:

// 在bootstrap.js或者你的Axios配置文件中添加拦截器
axios.interceptors.request.use(
  async (config) => {
    // 先尝试从localStorage获取缓存的token
    let token = localStorage.getItem('access_token');
    
    // 如果没有token,就重新请求获取
    if (!token) {
      const resp = await axios.post("/oauth/token", {
        "client_id": 7,
        "client_secret": "2GmvfxQev7AnUyfq0Srz4jJaMQyWSt1iVZtukRR6",
        "grant_type": "client_credentials",
        "scope": "*"
      });
      token = resp.data.access_token;
      // 把token存到localStorage,避免每次页面刷新都重新请求
      localStorage.setItem('access_token', token);
    }
    
    // 给当前请求设置Authorization头
    config.headers.Authorization = `Bearer ${token}`;
    return config;
  },
  (error) => {
    // 请求出错时的处理
    return Promise.reject(error);
  }
);

这种方式的好处:

  • 确保每次请求都能带上有效token,不管请求发起时机
  • 缓存token到本地,减少不必要的授权请求
  • 避免其他请求单独设置headers时覆盖默认头

3. 检查是否有代码覆盖了请求头

如果某些特定请求单独设置了headers参数,会覆盖全局的common头。比如:

axios.get('/api/data', {
  headers: {
    'Content-Type': 'application/json'
  }
})

这种情况可以把Authorization头合并进去,或者直接用上面的请求拦截器,拦截器会自动把Authorization头添加到所有请求里,不会被覆盖。

另外,你的原始getToken函数可以简化一下,没必要用then和临时变量,直接await返回更清晰:

async function getToken() {
  const resp = await axios.post("/oauth/token", {
    "client_id": 7,
    "client_secret": "2GmvfxQev7AnUyfq0Srz4jJaMQyWSt1iVZtukRR6",
    "grant_type": "client_credentials",
    "scope": "*"
  });
  return resp.data.access_token;
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:12:07