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?
bello sapere questa funzione. Una domanda, cosa intendi con "l'opzione di disconnessione dovrebbe essere implementata correttamente"? – dacuna
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. –
okay, grazie per il tuo commento! – dacuna