Cuando nos metemos en el mundo de las aplicaciones que requieren seguridad y control de acceso, es habitual que el backend nos pida una prueba de identidad en cada llamada. Para no volvernos locos enviando el mismo token manualmente en cada petición, existen herramientas llamadas interceptores, que actúan como un peaje inteligente donde podemos modificar la solicitud antes de que salga hacia el servidor.
La gran ventaja de usar este enfoque es que respetamos el principio DRY (Don’t Repeat Yourself), evitando que nuestro código parezca un disco rayado. Al centralizar la gestión de los encabezados, conseguimos que la aplicación sea mucho más mantenible y limpia, permitiéndonos además capturar errores de forma global sin tener que llenar cada servicio de bloques try-catch repetitivos.
Dominando los interceptores en Angular
En el ecosistema de Angular, un interceptor es básicamente una clase que debe implementar la interfaz HttpInterceptor. Esta interfaz nos obliga a definir un método llamado intercept, el cual recibe la petición actual y un manejador que se encarga de pasar la solicitud al siguiente paso de la cadena.
Si intentáramos enviar un token sin interceptores, tendríamos que crear un objeto de HttpHeaders en cada llamada, lo cual es un engorro absoluto. Al implementar la interfaz, podemos clonar la solicitud (ya que las peticiones en Angular son inmutables) y añadirle el token Bearer. Para que esto funcione, es vital registrar la clase en el app.module.ts dentro del array de providers, utilizando la clave HTTP_INTERCEPTORS y marcando el campo multi: true para no sobrescribir otros interceptores que pudieran existir.
Además de añadir tokens, podemos usar la potencia de RxJS y el operador catchError para gestionar las respuestas fallidas. De esta manera, si el servidor devuelve un error, el interceptor puede capturarlo y lanzar un mensaje personalizado o redirigir al usuario, manteniendo la lógica de negocio separada de la gestión de errores de red.
Implementación en Android con OkHttp y Retrofit
Si saltamos al desarrollo de aplicaciones Android, la combinación de OkHttp y Retrofit es el estándar de oro. Aquí, el proceso es similar pero con un giro muy interesante: podemos usar anotaciones personalizadas como @InjectAuth para decidir qué peticiones necesitan el token y cuáles deben ser públicas.
El flujo consiste en crear un AuthInterceptor que analice la petición. Si detecta que el método de la API ha sido marcado con nuestra anotación, el interceptor procede a insertar el encabezado de autorización automáticamente. Esto evita que el desarrollador tenga que añadir el token en cada definición de interfaz de Retrofit, mejorando drásticamente la escalabilidad del proyecto y la limpieza del código.
El rol de Axios en JavaScript
Para quienes desarrollan en JavaScript puro o frameworks ligeros, Axios ofrece una funcionalidad de interceptores muy potente y sencilla de configurar. Podemos definir interceptores tanto de solicitud (request) como de respuesta (response).
El interceptor de solicitud se ejecuta justo antes de que la petición salga, siendo el lugar ideal para inyectar el Authorization: Bearer token. Por otro lado, los interceptores de respuesta nos permiten procesar los datos antes de que lleguen al .then() o al await, o incluso realizar logs de depuración calculando cuánto tiempo ha tardado el servidor en responder mediante la comparación de marcas temporales.
Seguridad en el Backend con Spring Boot y JWT
Para que todo este despliegue en el cliente tenga sentido, el servidor debe saber gestionar estos tokens. En un entorno de Spring Boot, se suele implementar la arquitectura JWT (JSON Web Token). Un token JWT se compone de tres partes: el encabezado, el payload (con los datos del usuario y sus permisos) y la firma digital para evitar manipulaciones.
El proceso comienza con la autenticación, donde el usuario envía sus credenciales y el servidor genera un token firmado. Posteriormente, se implementa un filtro de autorización (como OncePerRequestFilter) que intercepta cada llamada entrante. Este filtro extrae el token del encabezado, lo valida mediante una clave secreta y, si es correcto, establece la autenticación en el contexto de seguridad de Spring para permitir el acceso al recurso.
Tener un sistema robusto de interceptores en el cliente y filtros en el servidor garantiza que la comunicación sea segura y eficiente. Desde la clonación de peticiones en Angular hasta las anotaciones en Retrofit o la validación de firmas en Spring Boot, el objetivo es siempre el mismo: automatizar la seguridad para que el programador pueda centrarse en la funcionalidad y no en la repetición de tareas tediosas de infraestructura. Comparte esta información para que más personas conozcan del tema.