Ich schreibe eine Webanwendung in Angular, in der die Authentifizierung von einem JWT-Token verwaltet wird. Dies bedeutet, dass jede Anforderung einen "Authentifizierungs" -Header mit allen erforderlichen Informationen enthält.
Dies funktioniert gut für REST-Aufrufe, aber ich verstehe nicht, wie ich mit Download-Links für im Backend gehostete Dateien umgehen soll (die Dateien befinden sich auf demselben Server, auf dem die Webservices gehostet werden).
Ich kann keine regulären <a href='...'/>
Links verwenden, da diese keinen Header enthalten und die Authentifizierung fehlschlägt. Gleiches gilt für die verschiedenen Beschwörungsformeln von window.open(...)
.
Einige Lösungen, an die ich gedacht habe:
- Generieren Sie einen temporären ungesicherten Download-Link auf dem Server
- Übergeben Sie die Authentifizierungsinformationen als URL-Parameter und behandeln Sie den Fall manuell
- Holen Sie sich die Daten über XHR und speichern Sie die Datei clientseitig.
Alle oben genannten sind weniger als zufriedenstellend.
1 ist die Lösung, die ich gerade verwende. Ich mag es aus zwei Gründen nicht: Erstens ist es in Bezug auf die Sicherheit nicht ideal, zweitens funktioniert es, aber es erfordert ziemlich viel Arbeit, insbesondere auf dem Server: Um etwas herunterzuladen, muss ich einen Dienst aufrufen, der einen neuen "Zufall" generiert "url, speichert es für einige Zeit irgendwo (möglicherweise in der Datenbank) und gibt es an den Client zurück. Der Client erhält die URL und verwendet window.open oder ähnliches. Auf Anfrage sollte die neue URL prüfen, ob sie noch gültig ist, und dann die Daten zurückgeben.
2 scheint mindestens so viel Arbeit.
3 scheint viel Arbeit zu sein, selbst wenn verfügbare Bibliotheken verwendet werden, und viele potenzielle Probleme. (Ich müsste meine eigene Download-Statusleiste bereitstellen, die gesamte Datei in den Speicher laden und dann den Benutzer bitten, die Datei lokal zu speichern.)
Die Aufgabe scheint jedoch ziemlich einfach zu sein, daher frage ich mich, ob es etwas viel Einfacheres gibt, das ich verwenden kann.
Ich bin nicht unbedingt auf der Suche nach einer Lösung "the Angular way". Normales Javascript wäre in Ordnung.