Contenido del curso
Comenzando con Sails
Setup de Espacio de Trabajo
CRUD
- 10

Entendiendo operaciones CRUD
05:09 min - 11

Crear modelo de rodada
07:43 min - 12

Crear app de Ionic
11:41 min - 13

Obtener todas las Rodadas: preparando la aplicación para mostrar datos
14:51 min - 14

Obtener todas las Rodadas: mostrando los datos
14:25 min - 15

Crear Rodada: recibiendo parámetros desde la URL
12:28 min - 16

Crear Rodada: enviando información desde el formulario
12:41 min - 17

Actualizar Rodada
12:16 min - 18

Eliminar Rodadas
04:54 min
Autenticación y Usuarios
Sistemas Externos
- 26

Uso de JSON Web Token
10:22 min - 27

Policies: verificar si usuario está loggeado
11:53 min - 28

Agregar usuario a Ride
09:47 min - 29

Preparando la App para implementar el Login y Sign up
11:01 min - 30

Implementando Login
Viendo ahora - 31

Implementando Sign up
09:35 min - 32

Agregar puntos de Rodada
15:20 min - 33

Obtener API Keys para Clima y Distancias
00:56 min - 34

Integración Google Geocoding: definiendo la lógica
14:56 min - 35

Integración Google Geocoding: probando la funcionalidad
06:14 min - 36

Integración Weather API
13:04 min - 37

Desplegar clima, distancia y tiempo en cada punto de Rodada
06:08 min
Cierre
Implementando Login
Resumen
Autenticar usuarios y proteger las rutas de una aplicación móvil es una de las tareas más comunes —y más críticas— en el desarrollo con Ionic y Angular. Aquí se explica paso a paso cómo conectar una pantalla de login con el backend, almacenar el JSON Web Token en el navegador y configurar un interceptor HTTP que adjunte automáticamente ese token a cada petición saliente.
¿Cómo se conecta la pantalla de login con el servicio de autenticación?
El punto de partida es una pantalla de login ya construida y un AuthenticationService con métodos de login y sign up. En el archivo homepage.ts se crea una función doLogin que centraliza toda la lógica de autenticación [0:28].
- Se inyecta
AuthenticationServiceen el constructor como dependencia privada. - Es necesario registrar ese servicio en el arreglo
providersdel archivoapp.module.tspara que Angular lo reconozca [1:08].
Dentro de doLogin se invoca this.authenticationService.login() pasándole un objeto con las propiedades email y password extraídas del formulario de credenciales [1:26].
¿Qué ocurre con la respuesta del backend?
Al llamar a .subscribe() sobre el observable que devuelve el servicio, se manejan dos caminos:
- Éxito: se recibe
dataque contiene el token. Se imprime conconsole.logpara verificar la respuesta y luego se almacena. - Error: se muestra un
alertcon el mensaje "No pudimos autenticarte" y se imprime el error en consola para depuración [1:55].
El token se guarda utilizando localStorage, un objeto global de JavaScript que permite almacenar datos de forma persistente en el navegador. Se usa localStorage.setItem('jwt', data.token) donde 'jwt' es el identificador del espacio de almacenamiento [2:24]. Como TypeScript no reconoce la propiedad token dentro de data, se anota el parámetro con el tipo any para evitar errores de compilación.
¿Cómo se maneja la navegación después del login?
Una vez almacenado el token, la aplicación redirige al usuario a la pantalla de rights mediante NavController. En lugar de usar .push(), que apila pantallas en el historial y permite volver atrás con el botón back de Android, se utiliza navigateRoute [3:18].
.push()conserva la pantalla anterior en la pila de navegación.navigateRoutereemplaza el estado actual, eliminando la posibilidad de regresar al login sin un botón de logout explícito.
¿Qué es un interceptor HTTP y por qué es necesario?
Aunque el token ya se encuentra en localStorage, ninguna petición lo envía automáticamente al backend. Ahí entra el concepto de interceptor. Un interceptor en Angular captura todas las solicitudes HTTP antes de que salgan, les agrega o modifica headers y luego las despacha [5:16].
Se crea el archivo token-interceptor.ts dentro de la carpeta services:
- La clase
TokenInterceptorServiceimplementa la interfazHttpInterceptor, lo que obliga a definir el métodointercept(request, next)[5:38]. - Dentro del método se extrae el JWT con
localStorage.getItem('jwt'). - Si el token existe, se clona la petición original con
req.clone()y se le añade el headerauthorizationcon el valor del token [6:18]. - Finalmente se llama a
next.handle(req)para continuar el flujo de la petición.
¿Cómo se registra el interceptor en la aplicación?
En app.module.ts, dentro del arreglo providers, se agrega un objeto con tres propiedades [7:06]:
provide: apunta a la constante globalHTTP_INTERCEPTORS.useClass: indica la claseTokenInterceptorService.multi: true: permite que coexistan múltiples interceptores.
¿Cómo resolver el error de CORS con los headers personalizados?
Al probar, aparece un error de CORS (Cross-Origin Resource Sharing) porque el backend en Sails no acepta el header authorization por defecto. La solución está en el archivo de configuración config/security del backend [7:38]:
- Se agrega la propiedad
headerscon los valores'content-type'y'authorization'. - Un detalle crítico: la clave debe ser
headersen plural; escribirheaderen singular no genera un error explícito pero impide que funcione [8:28].
Tras reiniciar el servidor y recargar la aplicación con empty cache and hard reload, las peticiones salen con el header authorization correctamente adjunto y el backend puede identificar al usuario autenticado [8:52].
Con este flujo completo —login, almacenamiento en localStorage, interceptor HTTP y configuración de CORS— la aplicación ya cuenta con un sistema de autenticación funcional. Si te has encontrado con algún detalle adicional al implementar este flujo, comparte tu experiencia en los comentarios.