代码之家  ›  专栏  ›  技术社区  ›  KitKit

在NuxtJS-VueJS中通过身份验证全局配置Axios

  •  3
  • KitKit  · 技术社区  · 6 年前

    我正在寻找通过NuxtJS-VueJS(我主要使用NuxtJS)进行身份验证来全局配置Axios的方法。

    我只需要: 如果用户登录并在$store中拥有令牌,axios将获得此令牌。如果用户是匿名的,axios将无法获取此令牌

    ~/插件/axios

    import axios from 'axios'
    import AuthenticationStore from '~/store'
    
    var api = axios.create({
      baseURL: 'http://localhost:8000/api/v1/',
      'headers': {'Authorization': 'JWT ' + AuthenticationStore.state.token}
    })
    
    api.interceptors.request.use(function (config) {
      config.headers = {
        'Authorization': AuthenticationStore.state.token ? 'JWT ' + AuthenticationStore.state.token : ''
      }
      return config
    }, function (error) {
      // Do something with request error
      return Promise.reject(error)
    })
    
    export default api
    

    ~/存储/索引。js公司

    const AuthenticationStore = () => {
      return new Vuex.Store({
        state: {
          token: null
        },
        mutations: {
          SET_TOKEN: function (state, token) {
            state.token = token
            instance.defaults.headers = { Authorization: 'Bearer ' + token }
          }
        },
        actions: {
          ....
        }
      })
    }
    
    export default AuthenticationStore
    

    错误: [nuxt] Error while initializing app TypeError: Cannot read property 'token' of undefined

    1 回复  |  直到 6 年前
        1
  •  1
  •   B2725    5 年前

    我建议改用拦截器,它更灵活,在发出请求而不是创建时获取令牌。尝试类似的操作以避免未设置标记的问题。

    // ~/plugins/axios
    import axios from 'axios'
    import AuthenticationStore from '~/store'
    
    var api = axios.create({
      baseURL: 'http://localhost:8000/api/v1/',
      'headers': {'Authorization': 'JWT ' + AuthenticationStore.state.token}
    })
     api.interceptors.request.use(function (config) {
      config.headers = {
        'Authorization': AuthenticationStore.state.token ? 'Bearer ' + AuthenticationStore.state.token : ''
      }
      return config
    }, function (error) {
      // Do something with request error
      return Promise.reject(error)
    })
    export default api
    

    如果需要没有auth头,则需要在拦截器请求时添加If。

    商店问题: 当您应该导出store实例时,您正在导出函数, 所以这是错误的:

    const AuthenticationStore = () => { 
    

    您应该导出实例,以便:

    const AuthenticationStore = new Vuex.Store({ ...
    

    请访问 https://vuex.vuejs.org/guide/ 以获得更好的理解。你不完全理解这一点也不错!在JS中导出模块/实例/并不容易完全理解。试着多学点。祝你好运