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

Posted

技术标签:

【中文标题】Axios 拦截器未从 vuex 商店获取当前用户身份验证令牌【英文标题】:Axios interceptor is not getting the current user auth token from vuex store 【发布时间】:2021-09-18 03:36:21 【问题描述】:

我正在使用 Axios 将用户输入发送到 DRF api,它会返回一个身份验证令牌。我将令牌保存在 vuex 商店中。在另一个组件中。我正在尝试使用请求标头中的最新令牌使用 Axios 请求另一个 api 端点。我遇到的问题是 Axios 将发送完全没有令牌的请求,或者使用之前登录用户的令牌发送请求。它不会从 vuex 存储中获取当前令牌。我使用 Axios 拦截器希望这会有所帮助,但它没有。

登录.vue

<script>

export default 
  name: 'Login',
  data () 
    return
      email: null,
      password: null,

      token: '',

    
    
  ,
  props: 
    
  ,

  methods: 
    submitForm () 

      this.$store.dispatch('loginUser',
        email: this.email,
        password: this.password
      ).then(() =>
        this.$router.push( name: 'List' )

      ) .catch(err =>
        console.log(err)
      )
      
    ,

  



</script>

存储/index.js

import axios from 'axios'
import  createStore  from 'vuex'


export default createStore(
  state: 
    token: localStorage.getItem('token'),
  ,
  mutations: 
    getToken(state, token) 
      localStorage.setItem('token', token)
      state.token = token
      
      
    
  ,
  actions: 
    loginUser( commit , data)
      axios(
        method: 'POST',
        url: 'http://localhost:8000/auth/login/',
        headers: 'Content-Type': 'application/json',
        data: 
          'email': data.email,
          'password': data.password,
        
      ).then(response =>
        commit('getToken', response.data['key'])
      )
    
  ,
  modules: 
  
)

List.vue

<script>
import axios from 'axios'
import store from '/src/store'
export default 
    name:'List',
    data () 
        return 
            entry: []
        
    ,

    created() 
        axios.interceptors.request.use(function (config)
            let token = store.state.token
            config.headers['Authorization'] = 'Token ' + token;
            return config;
        )
        axios(
        method: 'GET',
        url: 'http://localhost:8000/journal/',
        headers: 'Content-Type': 'application/json',
        
      ).then(response =>

          this.entry = response.data


        
      ) .catch(err =>
          console.log(err)
      )
    

</script>

我认为拦截器的目的是在实际发出 get 请求之前获取令牌,但它似乎没有这样做。

【问题讨论】:

【参考方案1】:

不完全确定为什么会这样,但是像这样重写我的 loginUser 操作可以解决我的问题。

actions: 
    loginUser( commit , data)
      return new Promise ((resolve, reject) => 

      
      axios(
        method: 'POST',
        url: 'http://localhost:8000/auth/login/',
        headers: 'Content-Type': 'application/json',
        data: 
          'email': data.email,
          'password': data.password,
        
      ).then(response =>
        commit('getToken', response.data['key'])
        resolve()
      ).catch(err => 
        reject(err)
      )
    )
    
  ,

我认为这是因为 return new Promise 基本上会中断 Login.vue 中的初始承诺,确保客户端在没有来自服务器的正确令牌的情况下不会发出 api 请求,但我不确定。

【讨论】:

以上是关于Axios 拦截器未从 vuex 商店获取当前用户身份验证令牌的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Axios 拦截器中获取 Vuex 存储

将 vuex 存储导入 axios 和 app.js 文件

Axios Intercept 在第一次调用时未从 localStorage 应用令牌

vue项目实战-----登录态管理(路由守卫+vuex+Axios)

无法在 Axios 拦截器中访问 Vuex 存储突变

Vue.js / Vuex + axios 发送多个 PUT 请求