2015-02-07 8 views
5

Zajmuję się tworzeniem pojedynczej strony z Javascriptem + AngularJS po stronie klienta i Spring MVC + Spring Security OAuth2 po stronie serwera. Spring MVC działa jako kontroler REST dla dowolnych żądań AJAX ze strony.Pobieranie plików w języku JavaScript za pomocą OAuth2

W celu autoryzacji skrypt wysyła nagłówki "Authorization: Bearer ..." z każdym żądaniem AJAX. Działa to dobrze, gdy żądasz niewielkich ilości danych. Aby pobrać pliki XML (eksport danych użytkownika) ja je pobrać za pośrednictwem AJAX, stosując nagłówki OAuth2 i stworzyć blob pozwala na zapisanie pliku w przeglądarce:

var blob = new Blob([data.data], {'type': "text/xml"}); 
var a = document.createElement("a"); 
a.href = window.URL.createObjectURL(blob); 
a.download = "downloaded-file-" + new Date().toISOString() + ".xml"; 
a.click(); 

Podejście to działa, ale

  • wykorzystuje RAM i tak nie nadaje się do dużych pobierania plików
  • nie wykazuje właściwą pasek postępu/Ładowanie

więc pytanie brzmi: czy istnieje zakład sposób pobierania plików z autoryzacją OAuth2? JavaScript nie pozwala na określenie nagłówków podczas wykonywania przekierowań, a OAuth nie pozwala na określenie tokena autoryzacji za pomocą parametrów URL. Mam na myśli zarówno

  • dodanie specjalnej metody kontrolera Wiosna MVC dostarczenie URL, który przekierowuje z tokena URL zakodowany do nagłówka żądania HTTP kodowane
  • dodając dodatkowy filtr do wiosny zabezpieczeń umożliwia wyodrębnianie token z URL Parametry
  • przeprowadzce do zezwolenia oparciu o pliki cookie zamiast OAuth2

Jeśli ktoś miał podobne problemy, czy mógłbyś podzielić się podejście do tego problemu?

Odpowiedz

3

Okazuje się, że to bardzo łatwe w wiosenno-security-OAuth2 2.0.7.RELEASE:

Wystarczy przekazać token dostępu jako parametr access_token żądanie:

window.open("service/export?access_token=" + access_token); 

Teraz, to pojawi z tokena dostępu w postaci zwykłego tekstu w historii pobierania, więc w celu zapewnienia właściwego bezpieczeństwa opcja "wylogowania" powinna być odpowiednio zaimplementowana, lub pobieranie będzie musiało zostać wykonane jako "formularz postu".

+0

miło znać tę funkcję. Jedno pytanie, co masz na myśli, mówiąc, że "opcja wylogowania powinna być właściwie wdrożona"? – dacuna

+5

Adres URL będzie przechowywany w historii przeglądarki wraz z tokenem. Każdy, kto ma dostęp do historii przeglądarki, będzie mógł znaleźć adres URL i wyodrębnić wartość access_token. Tak więc w przypadku, gdy użytkownik loguje się z publicznego komputera, musi być w stanie się wylogować (zniszczyć/zapomnieć hasło access_token po stronie serwera), w przeciwnym razie każdy będzie mógł korzystać ze swojego access_token, dopóki nie wygaśnie.Wiosna nie oferuje funkcji "wylogowania", więc jeśli tokeny nie są krótkotrwałe, należy wprowadzić funkcję, która usunie to hasło dostępu po stronie serwera. –

+0

Aaam ok, dzięki za komentarz! – dacuna

1

Zrobiłbym ciasteczka, gdybym był tobą - to eliminuje wszystkie kłopoty. Napisałem ostatnio kilka blogów, aby pokazać, jak łatwo jest (np. https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii). Ludzie zbyt często odkładają słuchawki na aplikacje "bezpaństwowe".

+1

jakie byłoby twoje rozwiązanie, aby zapobiec xsrf w tej sytuacji? – Bon

+0

Spring Security i Spring Security OAuth mają domyślnie włączone środki anty xsrf (nazywamy je "csrf"). Jeśli masz szczególne obawy, podniosę to jako osobne pytanie. –

+0

Ale jeśli ciasteczko pochodzi z zewnętrznego źródła, to w jaki sposób dostarczasz token do zapobiegania xsrf. – Bon

Powiązane problemy