Piszę aplikację internetową w Angular, w której uwierzytelnianie jest obsługiwane przez token JWT, co oznacza, że każde żądanie ma nagłówek „Authentication” ze wszystkimi niezbędnymi informacjami.
Działa to dobrze w przypadku wywołań REST, ale nie rozumiem, jak mam obsługiwać łącza pobierania plików hostowanych na zapleczu (pliki znajdują się na tym samym serwerze, na którym hostowane są usługi sieciowe).
Nie mogę używać zwykłych <a href='...'/>
linków, ponieważ nie mają one żadnego nagłówka, a uwierzytelnianie się nie powiedzie. To samo dotyczy różnych zaklęć window.open(...)
.
Niektóre rozwiązania, o których myślałem:
- Wygeneruj tymczasowe niezabezpieczone łącze pobierania na serwerze
- Przekaż informacje uwierzytelniające jako parametr adresu URL i ręcznie obsłuż sprawę
- Pobierz dane przez XHR i zapisz plik po stronie klienta.
Wszystkie powyższe są mniej niż zadowalające.
1 to rozwiązanie, którego teraz używam. Nie podoba mi się to z dwóch powodów: po pierwsze nie jest to idealne rozwiązanie z punktu widzenia bezpieczeństwa, po drugie działa, ale wymaga sporo pracy, szczególnie na serwerze: aby coś pobrać, muszę zadzwonić do usługi, która generuje nowy "losowy „url, przechowuje go gdzieś (prawdopodobnie w bazie danych) przez jakiś czas i zwraca do klienta. Klient otrzymuje adres URL i używa z nim window.open lub podobnego. Na żądanie nowy adres URL powinien sprawdzić, czy nadal jest ważny, a następnie zwrócić dane.
2 wydaje się co najmniej tyle pracy.
3 wydaje się dużo pracy, nawet przy użyciu dostępnych bibliotek i wiele potencjalnych problemów. (Musiałbym zapewnić własny pasek stanu pobierania, załadować cały plik do pamięci, a następnie poprosić użytkownika o zapisanie pliku lokalnie).
Zadanie wydaje się jednak dość podstawowe, więc zastanawiam się, czy jest coś znacznie prostszego, czego mógłbym użyć.
Niekoniecznie szukam rozwiązania „po kątach”. Zwykły Javascript byłby w porządku.