2014-11-21 10 views
6

Sto cercando di elaborare i file suedrive nel javascript lato client, ma prima ho bisogno di un modo per utilizzare XMLHttpRequest per scaricare il file. Microsoft Onedrive supporta cors per un sacco di operazioni, ma per il download in javascript c'è il seguente problema:Onedrive cors download in javascript

Come accennato qui: onedrive rest api manual

posso inviare una richiesta a:

GET https://apis.live.net/v5.0/FILE_ID/content?access_token=ACCESS_TOKEN

e risponderà con un'intestazione di posizione che reindirizza il browser al file. Il problema è quando invio queste richieste tramite XHR, il browser invia sempre l'intestazione Origin con la richiesta. Per la prima richiesta che ho descritto sopra, onedrive risponde anche con un'intestazione Access-Control-Allow-Origin: *, quindi la richiesta è consentita nel browser. Tuttavia, quando il browser viene reindirizzato alla posizione effettiva del file, tale risorsa non ha l'intestazione Access-Control-Allow-Origin, quindi la richiesta XHR viene negata dal browser (chrome invia un'intestazione Origin impostata su null per il richiesta di reindirizzamento).

Ho anche provato a ottenere la posizione ma non il reindirizzamento automatico, e quindi inviando un'altra richiesta XHR, questo imposterà l'intestazione di origine al dominio del mio sito, ma il risultato è lo stesso.

Come ho detto all'inizio, ho bisogno di elaborare i dati in javascript, quindi non sto chiedendo come scaricare i file onedrive sul disco rigido. Ho bisogno che i dati siano accessibili da javascript nella pagina web.

So che posso utilizzare la programmazione lato server per ottenere i dati del file per me e quindi inviarlo al client, ma per la mia applicazione questa non è un'opzione (almeno questo non è quello che sto chiedendo a il momento).

Se non c'è modo di farlo, qualcuno ha un'idea del perché avrebbe implementato la propria API in questo modo? Per consentire a javascript di ottenere la posizione tramite cors e reindirizzare ma non includere un'intestazione cors per la risorsa reindirizzata. Perché non solo negare cors, in primo luogo? è un insetto?

risposta

4

Questa non è una risposta, non posso ancora commentare.

La scorsa settimana è stata rilasciata la nuova API per onedrive. http://onedrive.github.io/index.htm

Sfortunatamente non risolverà il problema.

https://api.onedrive.com/v1.0/drive/root:{path and name}:/content?access_token={token} 

sarà ancora reindirizzare a un ressource da qualche parte a https://X.files.1drv.com/.X.

Il che non conterrà alcuna intestazione Access-Control-Allow-Origin. Lo stesso vale per l'Url "@content.downloadUrl" nella risposta JSON.

Spero che microsoft risolverà questo problema nel prossimo futuro, perché l'API è al momento di utilizzo molto limitato, dal momento che non è possibile elaborare il contenuto dei file da onedrive con le app html5. Oltre al solito browser di file.

L'unica soluzione, che vedo al momento sarebbe un'app di Chrome, che può elaborare l'Url senza CORS. vedi https://developer.chrome.com/apps/angular_framework

+0

Posso confermare la risposta ... non sembra esserci assolutamente alcun modo per scaricare un file da un'app javascript in un browser. Non c'è supporto CORS per l'URL di download. – user1936097

+0

Microsoft? Chiunque là fuori ... puoi commentare in che modo CORS è supportato nella tua API OneDrive? In questo momento posso autenticare, creare ed eliminare file dalla mia app singola, ma non posso scaricare !? Sembra un modo improbabile per rivendicare il supporto CORS – user1936097

+0

Attualmente sto integrando OneDrive con il nostro servizio, ma onestamente, sono in pochi centimetri dalla decisione di abbandonare completamente il supporto per questo, dobbiamo instradare i dati attraverso i nostri server, che è sia costoso, sia cattivo per la privacy e diminuisce la sicurezza. Seriamente, è passato un intero anno e non hanno fatto nulla per sistemare un problema così semplice ma allo stesso tempo vetroso. – user1419305

1

La casella fa esattamente la stessa cosa per le richieste di download.Non ho trovato alcun modo per aggirare questo problema senza coinvolgere un server perché il browser non consente al programma di accedere ai contenuti della risposta di reindirizzamento 302. Per ragioni di sicurezza non ne sono convinto, i browser seguono obbligatoriamente le richieste di reindirizzamento senza consentire l'intervento dell'utente.

Il modo in cui abbiamo finalmente lavorato intorno a questo era

  1. l'applicazione browser invia la richiesta GET al server, che inoltra al provider cloud (scatola/ondrive).
  2. del server quindi non segue la risposta reindirizzamento 302 da Box o Microsoft Onedrive
  3. Il server restituisce invece l'applicazione del browser, il contenuto del campo location nell'intestazione 302 risposta, che contiene l'URL per il download
  4. Il javascript nell'app browser, quindi, scarica il file utilizzando l'url.
+0

Ho appena controllato .. vedi il mio commento qui sotto. Questo metodo non funzionerà su OneDrive (almeno non ancora). CORS semplicemente non è supportato per il download – user1936097

3

La risposta, nel migliore dei casi, è che il download dei contenuti non può essere eseguito esclusivamente da JavaScript in un browser. Perché lo hanno fatto in questo modo? Dovresti chiedere loro, ma indovinerei sia un bug, sia alcuni "problemi di sicurezza" non specificati. Per quel che vale, che sembrano pensare che il download di contenuti è CORS compatibile nella documentazione qui: https://dev.onedrive.com/misc/working-with-cors.htm:

per scaricare file da Microsoft Onedrive in un'applicazione JavaScript non è possibile utilizzare l'/ API contenuti , dal momento che questo risponde con un reindirizzamento 302. Un reindirizzamento 302 è esplicitamente vietato quando è richiesta una verifica preliminare CORS, ad esempio quando si fornisce l'intestazione Autorizzazione.

Invece, l'app deve selezionare la proprietà @ content.downloadUrl, che restituisce lo stesso URL a cui il contenuto/reindirizzamento avrebbe indirizzato. Questo URL può quindi essere richiesto direttamente utilizzando XMLHttpRequest. Poiché gli questi URL sono pre-autenticati, possono essere recuperati senza una richiesta di preflight CORS .

Tuttavia, per quanto ne so, si sbagliano. Solo perché non hai bisogno di una richiesta di preflight non significa che la risposta sia conforme a CORS. Hai ancora bisogno di un'intestazione Access-Control-Allow-Origin sulla risposta.

Per chi si chiede, questo è ancora un problema nella nuova API Graph (che è essenzialmente un'API proxy per l'API OneDrive, come ho capito). Lo stesso problema di base è ancora presente: puoi ottenere un URL di download dai tuoi articoli, ma quell'URL rimanda a una risorsa non conforme a CORS, quindi non ti fa molto bene.

Ho un problema attivo aperto con Microsoft here su questo problema. C'è stata qualche risposta al mio problema (li ho portati a esporre l'URL di download attraverso l'API grafico), ma sto ancora aspettando di vedere se troveranno una soluzione reale per il download di contenuti da JavaScript.

Se ottengo una soluzione o una risposta reale a tale problema, proverò a riferire qui in modo che altri in futuro possano avere una risposta reale a cui fare riferimento.

1

Ora è possibile utilizzare la proprietà "@ content.downloadUrl" dell'elemento nella richiesta GET. Quindi non c'è reindirizzamento.

Da https://dev.onedrive.com/items/download.htm:

Restituisce un reindirizzamento Trovato 302 risposta ad un URL di download pre-autenticato per il file. Questo è lo stesso URL disponibile attraverso la proprietà @ content.downloadUrl su un elemento.