如何在axios中配置授权承载令牌?

Posted

技术标签:

【中文标题】如何在axios中配置授权承载令牌?【英文标题】:How to configure Authorization bearer token in axios? 【发布时间】:2021-08-28 09:49:08 【问题描述】:

您好,我创建了一个登录操作(使用 Vuex),它将用户 jwt 令牌保存到本地存储。在这个登录动作中,我调用另一个动作来获取该用户创建的一些帖子。当我在 fetchPosts 操作的获取请求的标头中传递令牌时,它工作得很好。

async login(context, user)
    try 
       const res = await api.post('/users/login', user)
       localStorage.setItem('jwt', res.data.token)
       context.commit('SET_USER', res.data.user)
       context.dispatch('fetchPosts')
    catch(err)
       console.log(err.response.data)
    


async fetchPosts(context)
    try 
        const res = await api.get('/posts', 
          headers: 
            Authorization: `Bearer $localStorage.getItem('jwt')`
          
        )
        context.commit('SET_POSTS', res.data)
     catch(err)
        console.log(err.response.data)
     

上面的代码工作得很好,但问题是我有几个身份验证路由,我不想通过

headers:  Authorization: `Bearer $localStorage.getItem('jwt')`

适用于所有 api 请求。

我想在 1 个文件中进行配置,我尝试过,但是当我登录时,我收到未经身份验证的消息,当我签入网络选项卡时,我看到 Bearer null 已传递给授权。请参阅下面我的配置尝试。

import axios from 'axios'
export default axios.create(
  baseURL: 'http://localhost:3000',
  headers: 
    Authorization: `Bearer $localStorage.getItem('jwt')`
  
)

任何人都知道我哪里出错了或者我可以做些什么来解决这个问题。

【问题讨论】:

这就是 Axios 拦截器的用途。 【参考方案1】:

将此添加到您的 main.js 文件中

    axios.interceptors.request.use(config => 
      const token = localStorage.getItem("jwt");
      config.headers["Authorization"] = `Bearer $token`;
      return config;
    );

【讨论】:

我在 src 的 api 文件夹中进行了配置。将代码添加到 api.js 之后。得到同样的错误。【参考方案2】:

这里有一个简单的例子来说明如何做到这一点。

    axios.interceptors.request.use(
        (config) => 
            const token = localStorage.getItem('authtoken');
    
            if (token) 
                config.headers['Authorization'] = `Bearer $token`;
            
    
            return config;
        ,
    
        (error) => 
            return Promise.reject(error);
        
    );

查找更多信息here

【讨论】:

当我在我的 api.js 文件中的导出顶部添加时似乎不起作用。 @Still.Dre 描述它是如何不起作用的。您是否看到请求中的标头?值错了吗? @Still.Dre 不起作用是一个全球概念。请说明问题。有没有错误?你是如何实施的?怎么了?【参考方案3】:

你可以直接在你创建的 axios 实例上应用拦截器

import axios from "axios";

const baseDomain = process.env.VUE_APP_API_URL;

const baseURL = `$baseDomain`;
const instance = axios.create(
  baseURL
);
instance.interceptors.request.use(
  (config) => 
    const token = localStorage.getItem('accesstoken');
    if (token) 
      config.headers['Authorization'] = `Bearer $token`;
    

    return config;
  ,

  (error) => 
    return Promise.reject(error);
  
);

export default instance;

【讨论】:

以上是关于如何在axios中配置授权承载令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在websocket javascript客户端中传递授权承载访问令牌

如何在 Axios 中传递 Bearer 令牌

如何使用 openapi-ui 和承载令牌(jwt)在 swagger-ui 中激活授权按钮?

如何将承载令牌添加到 HTTP 请求的标头?

如何使用 axios 在 rest-auth 中使用令牌发布? POST http://localhost:8000/rest-auth/password/change/ 401(未经授权)

如何使用AngularJS将身份验证承载令牌存储在浏览器cookie中