HTTP interceptor en Vue, acceso con token de sesión

Generalmente cuando se implementan aplicaciones frontend con accesos a Apis disponibles en un backend, estas están protegidas bajo algún tipo de autenticación como por ejemplo JWT. A continuación se presenta un ejemplo como a partir del axios como cliente HTTP se le pasa el token de acceso a las API en una peticion HTTP.

Lo primero es definir un store, para tener acceso a los datos de la session en cualquier componente de la aplicación

#src/store.js
state: {
session: {
	logged: false,
	token: '',
	userInfo:{}
}
},
getters: {
	session: state => state.session,
	logged: state => state.session.logged,
token: state => state.session.token
},
mutations: {
	....
}

Luego en cualquier componente si el usuario ya se ha logueado tenemos acceso a los datos de la sesión

#src/componenteX.vue
import { mapGetters } from 'vuex'
export default {
// ...
computed: {
	...mapGetters([
	'logged',
	'token',
	'userInfo'
	])
   }
}

En el archivo main.js de la aplicación configuramos axios para usar en el interceptor el token de acceso a las apis

import Vue from 'vue';
import store from 'src/store';
import router from 'src/router';
import App from 'src/App';
import interceptorsSetup from 'src/helpers/interceptors'
interceptorsSetup()
	new Vue({
	el: '#app',
	router,
	store,
	template: '<App/>',
	components: { App }
});

Definición del interceptor

#src/helpers/interceptors.js
import axios from 'axios';
import store from 'src/store';
export default function setup() {
axios.interceptors.request.use(function(config) {
	const token = store.getters.token;
	if(token) {
		config.headers.Authorization = `Bearer ${token}`;
	}
	return config;
}, function(err) {
	return Promise.reject(err);
});
}

Leave a Reply

Your email address will not be published. Required fields are marked *