Как проверить токен в JWT авторизации Vue

У меня вопрос, как сделать проверку токена и его обновление вначале всех действий vue.

Потому что на данный момент у меня это выполняется не последовательно, а асихронно. В итоге в момент когда создается интерфейс (запрашиваются данные по апи), так же идёт проверка токена.

Данные не пришли, потому что в момент запрашивания токен был старым.

Проблема пропадает, после смены пути или обновления страницы.

В данный момент я делаю проверку и перезапрос токена в route.before each. А так же делаю в App.vue в методе created.

Токен у меня живет 5 минут. Рефреш токен обновляется по апи.

Роутер:

router.beforeEach((to, from, next) => {    
    ...
    // Проверка токена существующего
    if(loggedIn) {
        // Если залогинен, проверить токен из хранилища
        let jwt = store.getters['auth/token'];
        let jwt_data = JSON.parse(atob(jwt.split('.')[1]));
        if (Date.now() / 1000 >= jwt_data.exp) {
            store.dispatch('auth/refreshtoken').then((res) => {
                if(res.success) { return next('/') }
            }).catch((err) => {
                this.flashMessage.error({
                    title: 'Техническая ошибка',
                    message: 'Ошибка восстановления сессии. Обратитесь к администратору.'
                })
            })
        }
    } else {
        // Если не залогинен, проверить refresh token
        store.dispatch('auth/refreshtoken').then((res) => {
            if(res.success) { return next('/') }
        }).catch((err) => {
            this.flashMessage.error({
                title: 'Техническая ошибка',
                message: 'Ошибка восстановления сессии. Обратитесь к администратору.'
            })
        })
    }
    ...
 })

Store:

export const auth = {
    namespaced: true,
    state: initialState,
    actions: {
        refreshtoken({ commit }) {
            return AuthService.refreshtoken().then(
                res => {
                    if(res.success) {
                        commit('loginSuccess', res.user);
                    } else {
                        commit('loginFailure');
                    }
                    return Promise.resolve(res);
                },
                error => {
                    commit('loginFailure');
                    return Promise.reject(error);
                }
            );
        },

    },
    mutations: {
        loginSuccess(state, data) {
            state.loggedIn = true;
            state.username = data.name;
            state.isAdmin = data.is_admin;
            state.token = data.token;
        },
        loginFailure(state) {
            state.loggedIn = false;
            state.username = null;
            state.isAdmin = false;
            state.token = null;
        },
    },
    getters: {
        token: state => {
            return state.token
        },
        loggedIn: state => {
            return state.loggedIn
        },
    }
};

App.vue

    export default {
        computed: {
            loggedIn() {
                return this.$store.getters['auth/loggedIn']
            },
            token() {
                return this.$store.getters['auth/token']
            },
        },

        created: function() {
            // Проверка токена существующего
            if(this.loggedIn) {
                let jwt =  this.token
                let jwt_data = JSON.parse(atob(jwt.split('.')[1]));
                if (Date.now() / 1000 >= jwt_data.exp) {
                    this.$store.dispatch('auth/refreshtoken').then((res) => {
                        if(res.success) { this.$router.push('/') }
                    }).catch((err) => {
                        this.flashMessage.error({
                            title: 'Техническая ошибка',
                            message: 'Ошибка восстановления сессии. Обратитесь к администратору.'
                        })
                    })
                }
            } else {
                this.$store.dispatch('auth/refreshtoken').then((res) => {
                    if(res.success) { this.$router.push('/') }
                }).catch((err) => {
                    this.flashMessage.error({
                        title: 'Техническая ошибка',
                        message: 'Ошибка восстановления сессии. Обратитесь к администратору.'
                    })
                })
            }
        }
    }


Ответы (0 шт):