2015-02-07 16 views
5

Sto sviluppando una pagina singola con Javascript + AngularJS sul lato client e Spring MVC + Spring Security OAuth2 sul lato server. Spring MVC funge da controller REST per qualsiasi richiesta AJAX dalla pagina.Download di file in Javascript con OAuth2

Per l'autorizzazione, lo script invia un'intestazione "Autorizzazione: Bearer ..." con ciascuna richiesta AJAX. Funziona bene quando si richiedono piccole quantità di dati. Per scaricare i file XML (esportazione di dati utente) I scaricarli tramite la tecnologia AJAX, utilizzando le intestazioni OAuth2 e creare un Blob per consentire il salvataggio del file nel browser:

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(); 

Questo approccio funziona, ma

  • utilizza RAM e quindi non è adatto per grandi download di file
  • non mostra una vera e propria barra di avanzamento/carico

quindi, la domanda è: c'è una scommessa modo di scaricare file con autorizzazione OAuth2? Javascript non consente di specificare le intestazioni durante i reindirizzamenti e OAuth non consente di specificare il token di autorizzazione tramite i parametri URL. Sto pensando di entrambi

  • l'aggiunta di uno speciale metodo di controllo Spring MVC per fornire un URL che reindirizza da un token con codifica URL a una richiesta HTTP header-encoded
  • l'aggiunta di un ulteriore filtro Primavera di sicurezza per permette l'estrazione il token da parametri URL
  • movimento ad autorizzazione basata su cookie invece di OAuth2

Se qualcuno aveva problemi simili, la prego di condividere il vostro approccio a questo problema?

risposta

3

scopre che è molto facile a In primavera-sicurezza-OAuth2 2.0.7.RELEASE:

semplicemente passare il token di accesso come il parametro access_token richiesta:

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

Ora, questo apparirà con il token di accesso in chiaro nella cronologia dei download, quindi per una sicurezza adeguata, l'opzione "logout" dovrebbe essere implementata correttamente, altrimenti il ​​download dovrà essere eseguito come "post di un modulo".

+0

bello sapere questa funzione. Una domanda, cosa intendi con "l'opzione di disconnessione dovrebbe essere implementata correttamente"? – dacuna

+5

L'URL verrà mantenuto nella cronologia del browser insieme al token. Chiunque abbia accesso alla cronologia del browser sarà in grado di trovare l'URL ed estrarre il valore access_token. Quindi, nel caso in cui un utente accede da un computer pubblico, ha bisogno di essere in grado di effettuare il logout (distruggere/dimenticare l'access_token sul lato server), altrimenti chiunque sarà in grado di usare la sua access_token fino alla scadenza.Spring non offre una funzionalità di "disconnessione", quindi, a meno che i token non abbiano vita breve, è necessario implementare una funzionalità per cancellare access_token dal lato server. –

+0

okay, grazie per il tuo commento! – dacuna

1

Vorrei andare con i biscotti se fossi in te - ci vuole tutto il fastidio di esso. Recentemente ho scritto alcuni blog per dimostrare quanto sia facile (ad esempio https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii). Le persone si attaccano troppo alle applicazioni "apolidi".

+1

quale sarebbe la soluzione per evitare xsrf in questa situazione? – Bon

+0

Spring Security e Spring Security OAuth hanno entrambe le misure anti xsrf (che chiamiamo "csrf") che sono attive per impostazione predefinita. Se hai una preoccupazione particolare, la solleverei come una domanda separata. –

+0

Ma se il cookie proviene da una fonte esterna, come stai fornendo il token per la prevenzione di xsrf è ciò di cui sono curioso. – Bon