J'écris une webapp en Angular où l'authentification est gérée par un jeton JWT, ce qui signifie que chaque demande a un en-tête "Authentication" avec toutes les informations nécessaires.
Cela fonctionne bien pour les appels REST, mais je ne comprends pas comment je dois gérer les liens de téléchargement pour les fichiers hébergés sur le backend (les fichiers résident sur le même serveur où les services Web sont hébergés).
Je ne peux pas utiliser de <a href='...'/>
liens réguliers car ils ne porteront aucun en-tête et l'authentification échouera. Idem pour les différentes incantations de window.open(...)
.
Quelques solutions auxquelles j'ai pensé:
- Générer un lien de téléchargement temporaire non sécurisé sur le serveur
- Transmettez les informations d'authentification en tant que paramètre d'URL et gérez manuellement le cas
- Récupérez les données via XHR et enregistrez le fichier côté client.
Tout ce qui précède est loin d’être satisfaisant.
1 est la solution que j'utilise actuellement. Je n'aime pas ça pour deux raisons: premièrement ce n'est pas idéal du point de vue sécurité, deuxièmement ça marche mais ça demande beaucoup de travail surtout sur le serveur: pour télécharger quelque chose, je dois appeler un service qui génère un nouveau "aléatoire "url, le stocke quelque part (éventuellement sur la base de données) pendant un certain temps, et le renvoie au client. Le client obtient l'URL et utilise window.open ou similaire avec. Lorsqu'elle est demandée, la nouvelle URL doit vérifier si elle est toujours valide, puis renvoyer les données.
2 semble au moins autant de travail.
3 semble beaucoup de travail, même en utilisant les bibliothèques disponibles, et beaucoup de problèmes potentiels. (J'aurais besoin de fournir ma propre barre d'état de téléchargement, de charger le fichier entier en mémoire, puis de demander à l'utilisateur de sauvegarder le fichier localement).
La tâche semble cependant assez basique, alors je me demande s'il y a quelque chose de beaucoup plus simple que je puisse utiliser.
Je ne cherche pas forcément une solution "à la manière angulaire". Javascript régulier serait bien.