Axios 拦截器令牌标头存在于配置中,但不存在于请求标头中

Posted

技术标签:

【中文标题】Axios 拦截器令牌标头存在于配置中,但不存在于请求标头中【英文标题】:Axios interceptor token header is present in config but not in request headers 【发布时间】:2018-06-08 03:48:22 【问题描述】:

我创建了 axios 拦截器,它负责在每个请求发送到我的 rest API 之前添加令牌。

import axios from 'axios';
import  store  from '../store/store';

export default function execute() 
    axios.interceptors.request.use(function(config) 
        const token = store.state.token;
        if(token) 
            config.headers.Authorization = `Bearer $token`;
            console.log(config);
            return config;
         else 
            console.log('There is not token yet...');
            return config;
        
    , function(err) 
        return Promise.reject(err);
    );

正如您在第 2 行中看到的,我正在导入 vuex 存储,这实际上是存放我的令牌的地方。在第 8 行中,我实际上将此标记添加到 config 对象,然后在下一行中,我正在安慰它。

它在我的 main.js 文件中执行,如下所示:

import interceptor from './helpers/httpInterceptor.js';
interceptor();

令牌存在于我在控制台中看到的配置对象中(因为我安慰了config 对象):

每次我按预期要求休息 API 时,它都会运行。如果令牌存在(登录后),它应该向每个请求添加令牌头。不幸的是,虽然它存在于配置对象上,但它并没有添加它,这让我有点困惑。

正如我在网络选项卡中看到的那样,它实际上并没有将令牌添加到真实请求:

此屏幕截图当然是在登录后拍摄的,因此令牌已经在 vuex 存储中,并且在我执行注销功能(调用 rest API)后,它控制了配置(拦截器的一部分)。

结果我有 400 (Bad request) 状态来响应我的其余 API,因为我没有发送令牌。

编辑!!!

我在想我可以在这个问题中添加什么来使它变得更好。我认为创建演示 plunker 是不可能的,所以我决定创建一个小的 repository 演示,您可以下载并查看问题。希望对解决问题有帮助!

【问题讨论】:

我应该添加有关如何将令牌存储到 vuex 存储的信息吗?我不知道这是否与我的问题有关。 您能否对令牌进行硬编码并查看它是否有效? 不幸的是,当我在拦截器中硬编码令牌时,它没有改变任何东西它仍然具有相同的行为。 【参考方案1】:

我想通了。

我不知道有一种叫做 preflight request 的东西,它在真正请求 rest API 之前执行。如果预检请求失败,它将不会接受/接收更多标头。这就是为什么我在 chrome 控制台网络选项卡中的实际请求中没有看到它,但它在配置对象中,它在拦截器中是 console.loged。

在调用不存在的 URL 的存储库演示中也是如此,因此预检请求在那里也失败了。在创建这个演示时,我不知道存在诸如预检请求之类的东西,所以我确信我是否会调用一些现有的 URL 端点或虚构的端点并不重要,我认为这两种方式我都应该能够看到请求头在那里。

【讨论】:

【参考方案2】:

您还可以在过期时操纵对清理令牌的响应。

  axios.interceptors.response.use(function (response) 
    return response;
  , function (error) 
    if (401 === error.response.status) 
      console.log("Session Expired")
      //window.location = '/login'
     else 
      return Promise.reject(error);
    
  );

【讨论】:

以上是关于Axios 拦截器令牌标头存在于配置中,但不存在于请求标头中的主要内容,如果未能解决你的问题,请参考以下文章

Axios 拦截器未从 vuex 商店获取当前用户身份验证令牌

React + axios + redux 拦截器

多个请求的 axios 拦截器刷新令牌

Axios 拦截器不会在页面加载时拦截

使用标头参数的邮递员授权工作但不适用于 Axios 标头

在自定义反应钩子中使用 axios