【问题标题】:Axios - unable to set global Authorization headerAxios - 无法设置全局授权标头
【发布时间】:2019-04-11 11:03:18
【问题描述】:

我有一个带有 Axios 的 VueJS vue-cli 应用程序,我想使用登录后收到的令牌设置全局授权标头,以便我可以在所有后续请求中重复使用它。这是我的代码。

main.js

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

console.log(store.state)
axios.defaults.baseURL = 'http://54.38.36.242'
axios.defaults.headers.common['Authorization'] = store.getters.token

当我这样设置标题时,浏览器控制台会说: Authorization: [object Object]。为什么?

登录后console.log(store.state) 显示令牌已收到并在商店中设置。

store.js

export default new Vuex.Store({
  state: {
    apiToken: null,
    user: null,
    ...
  },
  mutations: {
    authenticateUser(state, payload) {
      state.apiToken = payload.token
      state.user = payload.user
      state.signedIn = true
    },
    ...
  },
  actions: {
    login({ commit }, payload){
      axios.post('/api/users/login', payload)
        .then(response => {
          commit('authenticateUser', {
            token: response.data.api_token,
            user: response.data.user
          })
          router.replace('/dashboard')
        })
        .catch(error => {
          commit('signInError')
        })
    },
    ...
  },
  getters: {
    token: state => {
      return state.apiToken;
    }
  }
})

我曾尝试通过store.state.apiToken 访问令牌,但也没有成功。 我做错了什么?

【问题讨论】:

  • 您需要一个请求拦截器,以便每次都可以从存储中获取 API 令牌。否则,您只会将其设置为初始值,即 null
  • 这行得通。谢谢你的提示。

标签: vue.js axios


【解决方案1】:

看起来response.data.api_token 不是纯字符串而是对象。如果您将标题设置行更改为:

axios.defaults.headers.common['Authorization'] = JSON.stringify(store.getters.token)

问题应该更容易诊断。

另外,除非你做定制,你还需要在header值中设置一个授权类型,使值变成Bearer <token>或者Basic <token>

【讨论】:

  • 在突变authenticateUser 我做了console.log(payload.token),它是一个纯字符串,它是一个完全有效的令牌。如果我设置axios.defaults.headers.common['Authorization'] = 'Bearer ' + store.state.apiToken,标题看起来像这样Authorization:Bearer null。我错过了什么吗?为什么令牌为空,因为它是 state.apiToken 中的字符串
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2017-05-01
  • 2021-08-27
  • 2023-04-08
  • 2020-09-12
  • 2021-11-21
相关资源
最近更新 更多