Vue Cookies .get(‘токен’) возвращает нуль

#javascript #vue.js

#javascript #vue.js

Вопрос:

В моем проекте используются vuex, axios, vue-cookies и JWT. У меня есть файл с именем api.js который импортируется в мой основной vue js, api.js код ниже;

 import axios from 'axios'
import Vue from 'vue'
import { store } from "@/store";

export default axios.create({
    baseURL: store.state.endpoints.baseUrl,
    headers: {
        Authorization: `JWT ${Vue.$cookies.get('token')}`,
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    }
})
  

Когда я вхожу в систему через свою страницу входа, все кажется успешным. В инспекторе значение cookie ‘token’ корректно обновляется с помощью нового токена, обновления Vuex показывают, что пользователь аутентифицирован, и маршрутизатор перенаправляет меня на домашнюю страницу.
Однажды на домашней странице, если я пытаюсь перейти на страницу, которая выполняет какой-либо вызов, требующий аутентификации, в заголовке он передает ‘JWT null’ вместо токена в файле cookie и завершается неудачей, и я оказываюсь в бесконечном цикле успешного входа в систему, но не могу никуда перейти.

Если я войду в систему, а затем обновлю страницу, прежде чем делать что-либо еще, все будет работать так, как ожидалось, и JWT больше не будет нулевым. Похоже, что api.js код в верхней части этого вопроса неправильно извлекает токен из файла cookie каждый раз, когда он вызывается, но только при обновлении страницы, он кэшируется или мне нужно каким-то образом перезагрузить этот импорт после входа в систему?

Для справки, фрагмент кода с моей страницы входа в систему, чтобы показать, как данные обновляются после входа в систему;

   api.post(this.$store.state.endpoints.obtainJWT, payload)
      .then((response) => {
        console.log("Token - " response.data.token);
        console.log("Profile - " response.data.user);
        this.$cookies.set('token', response.data.token);
        this.$store.commit("setAuthUser",
            {authUser: response.data, isAuthenticated: true})
      })
      .then(() => this.$router.push({path: '/'}))
      .catch((error) => {
        console.log("Error!");
        console.log(error);
        console.debug(error);
        console.dir(error);
      })
  

и пример вызова api, который содержит ‘JWT null’, если к нему обращаются перед обновлением страницы;

 import api from "../api.js";
...
api.get("/data_full/"   id)
  .then((response) => {
    this.title = response.data.title;
  })
  

и в моих проектах main.js , в api.js импорт;

 ...
import api from './api.js'
...
Vue.$http = api;
  

Ответ №1:

Прочитав мой вопрос после публикации, я понял, что проблема заключается не в вызове get (‘token’), а в том, что я создаю экземпляр Axios, который явно не воссоздается после сохранения токена в cookie.

Теперь я переместил код, относящийся к заголовку авторизации, из api.js и в main.js в качестве перехватчика. Таким образом, значение токена в cookie извлекается каждый раз, когда выполняется вызов Axios. Это решило мои проблемы. Обновленный код в main.js ниже;

     ...
    api.interceptors.response.use(
        config => {
            const token = Vue.$cookies.get('token');
            if ( token != null ) {
                config.headers.Authorization = `JWT ${token}`;
            }
            return config
        },
    ...