Implementa autenticación sin estado en Vue.js con JSON Web Token (JWT) y mejora la seguridad percibida del usuario. Aquí verás cómo estructurar el token, proteger rutas con Vue Router, automatizar headers con Trae e integrar localStorage para una single-page application eficaz y escalable, tal como explica Ignacio Anaya.
¿Por qué usar tokens JWT en Vue.js?
La autenticación por tokens permite aplicaciones sin estado y desacopladas, ideales para API REST y single-page applications. No dependes de sesiones en el servidor y puedes escalar horizontalmente sin fricción.
Sin estado: cada request incluye quién es el cliente. No hay sesión en el servidor.
Desacoplado: obtener y validar el token puede ocurrir en servicios distintos.
Escalable: sin compartir estado entre instancias; admite load balancer sin complicaciones.
Casos de uso: single-page application, serverless, APIs, móviles e IoT.
Nota clave: la autenticación real vive en el servidor. En el cliente, es experiencia de usuario.
¿Cómo funciona la estructura de un JSON Web Token?
Un JWT es autocontenido y está dividido en tres partes codificadas en Base64 y separadas por puntos: header, payload y signature. Permite incluir información del usuario sin consultas adicionales.
Header: tipo de token (JWT) y algoritmo, p. ej., HS256. Define cómo se firma.
Payload: datos del usuario y claims estándar como issuer (iss). Puedes incluir rol, mail y otros atributos de negocio.
Signature: se firma el header y el payload con una frase secreta. Si se altera cualquier dato, la firma no coincide y el token es inválido.
Seguridad práctica: la firma usa un código único (función de hash). Dos mensajes distintos no deben producir el mismo código, evitando manipulación maliciosa.
En headers HTTP se envía como Authorization con prefijo Bearer.
Ejemplo de contenido decodificado (representativo):
¿Cómo integrar JWT con Vue Router, Trae y localStorage?
Para una SPA en Vue, combina Vue Router para el flujo de navegación, Trae para peticiones HTTP y localStorage para persistir el token del lado del cliente. Recuerda: esto no reemplaza la validación del servidor.
¿Cómo guardar token y usuario en localStorage?
Al autenticar, la API retorna el token. Guarda el token completo y decodifica el payload para mostrar datos del usuario cuando sea necesario.
// En el método de login (res es la respuesta de la API)const token = res.data.token;// "header.payload.signature"localStorage.setItem('token', token);// Obtener la parte del medio (payload) y decodificar Base64const payloadBase64 = token.split('.')[1];const user =JSON.parse(atob(payloadBase64));// Persistir datos útiles del usuariolocalStorage.setItem('user',JSON.stringify(user));
Puntos clave:
Guarda el token completo para autenticar requests.
Decodifica solo el payload para leer rol, email u otros atributos.
Evita incluir contraseñas en el payload.
¿Cómo inyectar el token en cada request con Trae?
Usa un hook de Trae para agregar el header Authorization automáticamente en cada request autenticado.
Consistencia al usar Authorization: Bearer <token>.
¿Cómo proteger rutas con Vue Router?
Define rutas públicas con meta y usa un guard para redirigir según autenticación. Recuerda: en el cliente es control de interfaz; el servidor sigue validando el token.
importVuefrom'vue';importRouterfrom'vue-router';importHomefrom'./components/Home.vue';importLoginfrom'./components/Login.vue';importProfilefrom'./components/Profile.vue';Vue.use(Router);const router =newRouter({routes:[{path:'/',name:'home',component:Home},{path:'/profile',name:'profile',component:Profile},{path:'/login',name:'login',component:Login,meta:{is_public:true}},],});functionisAuthenticated(){return!!localStorage.getItem('token');}router.beforeEach((to,from, next)=>{const isPublic = to.meta&& to.meta.is_public===true;if(!isPublic &&!isAuthenticated()){returnnext({name:'login'});// no autenticado: ir a login}if(to.name==='login'&&isAuthenticated()){returnnext({name:'home'});// autenticado: no volver a login}next();});exportdefault router;
Extras útiles según el flujo descrito:
Usa un endpoint de verificación para validar el token en el servidor.
Incluye en el payload rol y permisos para habilitar/ocultar contenido por perfil.
En el servidor, implementa middleware como express-jwt y librerías como json_web_token en Node y Express para emitir y validar.
¿Te gustaría compartir cómo gestionas roles, permisos y redirecciones con JWT en Vue? Deja tu comentario y cuéntanos tu enfoque.
Curso de JWT con Vue a detalle, quien vota por ello?
Me gustaría, que hiciera un curso con JWT y también incluir auth con github.
Acá el repositorio:
Gracias. 😄
Acá el repositorio de la API:
Link de la API de node
Link de la app con vue
si manejando tokens ya no se manejan sesiones del lado del servidor , de que manera puedo evitar que mas de 1 usuario pueda estar logeado en el sistema al mismo tiempo??
Esta muy bueno esto, ahora probare con passport la autentificacion con facebook, ¿tienes el codigo del lado del server?
Hola, aca te dejo el codigo pero tene en cuenta que es simplemente una demo con data mockeda. Saludos
Muchas Gracias!!!
En un proyecto me surgio la necesidad de realizar un refresh token ya que cuando del lado del servidor solo verifico si el token existe, es valido y no ha expirado sino entonces lo retorno a login eso lo hace en cada API, como podria refrescar ese token automaticamente y mantener la seguridad en la aplicacion. que cosas debo tomar en cuenta.
el protocolo oauth2 define la implementacion de un metodo para hacer refresh de token por medio de un token especial para refrescar el token original.
Me encantó esta clase, sobre todo porque es algo que estoy a punto de implementar, aún así, me gustaría saber cuál sería la forma de hacer esto usando server sider rendering, pues hasta donde se, al menos en el caso de Nuxt.js, para crear una ruta, basta con crear el componente dentro de pages, pero no se cómo podría agregar la lógica de validación de rutas públicas y privadas ahí dentro
Ojala hubieran cursos de nuxt here
pero solo hay de next
Excelente curso Nacho sos un muy buen profe, ademas aprendi muchisimo sobre JS y buenas practicas
Alguien sabe el repo de este ejemplo?
Mil gracias
Aquí va demo-auth-jwt-vue :D
Estoy armando un login con un api y vuex, pero el navegador (Chrome) me muestra un mensaje de seguridad que dice: "Tu contraseña a sido expuesta debido a una violación de la seguridad..."
Se muestra al querer redirigir con vue-router o al renderizar un nuevo layout. Alguna idea? a alguien le ha pasado?
Eso es por que estas en localstorage
Tengo una consulta, si yo sigo la estructura del proyecto platzimusic y a este le agrego un formulario de login con validación de athentication en routes (lo explicado en el vídeo de uthentication), ¿como puedo cambiar el Bearer token de la variable constante platziMusicService ubicada en la ruta src/services/platzi-music.js, si esta se inicializa en login, lo pregunto por que al crear el login en platzi music service, me logeo y al redirigirme al listado me aparece error de authentication en la Api, con un ejemplo personal que hice de backend y tengo que recargar la pagina para que la query se envie con el token, utilizo axios.
Muchas gracias por el curso, esta muy bueno... pero tengo varias cosas sin entender; teniendo en cuenta que estamos implementando **vue **con vue-router primero importamos Vue y luego lo volvemos a importar en el router, como que hay codigo repetitivo, ejemplo:
Muchas gracias, el curso me ayudo mucho, algo que no encontré en el curso es lo siguiente:
La posibilidad de renderizar datos automáticamente que se actualizan en la base de datos mientras se despliegan los mismos en una vista, es decir que la App. sea responsiva con el modelo o la información de la Base de Datos.
Muchas gracias por la ayuda!
Para lograr lo que comentas, se necesitaría de un conjunto de artefactos. Inicialmente tu base de datos debería tener la capacidad de notificar los cambios y de que haya alguien escuchando esos cambios para luego por medio de un trigger renderizar de nuevo la vista.
por ejemplo RethinkdDB te ofrece la posibilidad de notificar los cambios en los datos.
que Genial esta este live
Yo personalmente uso un plugin llamado vuex-persistedstate para poder acceder a esa informacion como si fuera el state. Aunque hay que tener cuidado si no se quiere que todo el estado de la aplicacion entre en localstorage,
AYUDA !! Estoy usando el modelo del curso como base para un proyecto laboral, lógicamente también uso TRAE para hacer las llamadas al CORE…tengo una llamda (POST) con la cual hago login en el API REST…esa llamada usa BASIC AUTH…la misma llamada en POSTMAN funciona OK, en cambio en TRAE no…no hay cookies de por medio ni ningún otro header que se agregue…Tienen idea porque falla ??? Yo no se si TRAE me deja hacer un POST con un body vacio…tal vez el error venga por ahí…
tal ves necesitas mandar el header de 'Content-Type: application/json’
Si no cámbiate a axios, tiene mucha documentación en internet y por default funciona
Si me pueden ayudar con el link del proyecto de api ??
Esto lo manejé hace unos años con MEAN, pero me interesaría aplicarlo con Laravel y Vue, o hacerlo con PHP vanilla y Vue.
De pronto te pueda ser mas útil laravel passport, que esta hecho para una integración mas fácil con laravel y tiene una mayor facilidad de implementación.
te dejo esta guia del paso a paso para la implementación de passport en laravel, por si te puede interesar.