JWT con Vue Router: autenticación completa
Clase 53 de 53 • Curso Profesional de Vue.js 2
Contenido del curso
CLI y Dev Tools
- 3

Instalación de Vue.js: Node, Dev Tools y CLI
06:13 min - 4

Crear una aplicación Vue con CLI y webpack
12:49 min - 5

Cómo funciona webpack.config.js
10:38 min - 6

Babel: transpilador de JavaScript moderno
05:06 min - 7

ESLint con Standard JS: linteo automático en webpack
15:34 min - 8

Configuración de Sass y Bulma en Vue
06:18 min - 9

Cómo configurar Pug en Vue con webpack
04:23 min - 10
Diseño de Mockups: Práctica y Colaboración en Comunidad
00:20 min - 11
Creación de Vistas con Mockups y Vue.js
00:32 min
Manipulación del DOM
- 12

Expresiones en Vue: sintaxis doble llave
03:49 min - 13

Diferencia entre v-show y v-if en el DOM
06:22 min - 14

Qué es data binding en Vue.js
04:11 min - 15

Computed properties en Vue.js: cómo crearlas
04:13 min - 16

Qué son los watchers de Vue
02:25 min - 17

Eventos Vue: directiva v-on y métodos format
06:12 min - 18

Cómo construir una interfaz de búsqueda completa en Vue
19:03 min - 19
Manipulación del DOM con Vue.js: Práctica y Ejercicios
03:00 min
REST y HTTP
Sistema de Componentes
- 23

Cómo crear componentes en Vue
08:46 min - 24

Componentes Layout en Vue con Bulma
09:50 min - 25

Reactividad en Vue: $set y Object.assign
06:14 min - 26

Hooks del ciclo de vida en Vue.js
05:38 min - 27

Comunicación padre-hijo con props en Vue
23:27 min - 28

Eventos en Vue: comunicar hijo a padre
12:04 min - 29

Slots: HTML dinámico en componentes Vue
13:42 min - 30

Plugin Event Bus: comunicar componentes sin relación en Vue
19:19 min
Vue Router
Extendiendo VueJS
Clases, Animaciones y Transiciones36
Vuex
- 39

Cómo Vuex centraliza estados en Vue
03:41 min - 40

Instalación de Vuex con estado único
17:32 min - 41

Cómo usar mutations y commit en Vuex
08:16 min - 42

Getters de Vuex: mapGetters y store sincronizado
07:35 min - 43

Cómo dispatch ejecuta actions asincrónicas en ViewX
07:54 min - 44

Instalación de Viewex en Platzi Music
26:37 min
Nuxt.js
Deploy a Producción con Now
Conclusiones
Bonus
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):
// Header { "alg": "HS256", "typ": "JWT" } // Payload (ejemplo) { "email": "user@mail.com", "role": "root", "iss": "issuer-service" }
¿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 Base64 const payloadBase64 = token.split('.')[1]; const user = JSON.parse(atob(payloadBase64)); // Persistir datos útiles del usuario localStorage.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.
import trae from 'trae'; const api = trae.create({ baseUrl: 'https://tu-api' }); api.before((config) => { const token = localStorage.getItem('token'); if (token) { config.headers = config.headers || {}; config.headers.Authorization = `Bearer ${token}`; // estándar } return config; }); export default api;
Beneficios:
- Menos código repetido en cada llamada.
- 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.
import Vue from 'vue'; import Router from 'vue-router'; import Home from './components/Home.vue'; import Login from './components/Login.vue'; import Profile from './components/Profile.vue'; Vue.use(Router); const router = new Router({ routes: [ { path: '/', name: 'home', component: Home }, { path: '/profile', name: 'profile', component: Profile }, { path: '/login', name: 'login', component: Login, meta: { is_public: true } }, ], }); function isAuthenticated() { return !!localStorage.getItem('token'); } router.beforeEach((to, from, next) => { const isPublic = to.meta && to.meta.is_public === true; if (!isPublic && !isAuthenticated()) { return next({ name: 'login' }); // no autenticado: ir a login } if (to.name === 'login' && isAuthenticated()) { return next({ name: 'home' }); // autenticado: no volver a login } next(); }); export default 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-jwty librerías comojson_web_tokenen 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.