Estoy escribiendo una aplicación web en Angular donde la autenticación es manejada por un token JWT, lo que significa que cada solicitud tiene un encabezado de "Autenticación" con toda la información necesaria.
Esto funciona bien para las llamadas REST, pero no entiendo cómo debo manejar los enlaces de descarga para los archivos alojados en el backend (los archivos residen en el mismo servidor donde están alojados los servicios web).
No puedo usar <a href='...'/>
enlaces regulares ya que no llevarán ningún encabezado y la autenticación fallará. Lo mismo ocurre con los diversos encantamientos de window.open(...)
.
Algunas soluciones en las que pensé:
- Genere un enlace de descarga temporal no seguro en el servidor
- Pase la información de autenticación como un parámetro de URL y maneje manualmente el caso
- Obtenga los datos a través de XHR y guarde el archivo del lado del cliente.
Todo lo anterior es menos que satisfactorio.
1 es la solución que estoy usando en este momento. No me gusta por dos razones: primero, no es ideal en cuanto a seguridad, segundo, funciona pero requiere bastante trabajo, especialmente en el servidor: para descargar algo, necesito llamar a un servicio que genera un nuevo "aleatorio "url, lo almacena en algún lugar (posiblemente en la base de datos) durante un tiempo y lo devuelve al cliente. El cliente obtiene la URL y usa window.open o similar con ella. Cuando se solicite, la nueva URL debe verificar si aún es válida y luego devolver los datos.
2 parece al menos tanto trabajo.
3 parece mucho trabajo, incluso usando bibliotecas disponibles, y muchos problemas potenciales. (Necesitaría proporcionar mi propia barra de estado de descarga, cargar todo el archivo en la memoria y luego pedirle al usuario que guarde el archivo localmente).
Sin embargo, la tarea parece bastante básica, así que me pregunto si hay algo mucho más simple que pueda usar.
No estoy buscando necesariamente una solución "al estilo Angular". Javascript regular estaría bien.