Orso con me, questo ha bisogno di un po 'di spiegazione.Credenziali cookie CORS da WebView mobile caricate localmente con file: //
Sto collaborando alla creazione di un'app mobile web ibrida. Il codebase principale è HTML5 e JavaScript, che verrà inserito in una visualizzazione Web mobile nativa (a la Phonegap).
Parte della funzionalità richiede che l'app invii informazioni a un servizio Web controllato da uno dei nostri clienti. C'è molto poco spazio per cambiare questo servizio web in quanto viene utilizzato da altri. Inviamo JSON utilizzando un POST HTTP e riceviamo le risposte dal server. Parte di questa risposta è un cookie JSESSIONID che gestisce la nostra sessione con il server. Dopo la chiamata iniziale initSession()
, è necessario inviare il cookie JSESSIONID con ogni richiesta (AJAX).
Quando distribuito su un dispositivo mobile, l'app Web viene avvolta nella visualizzazione Web nativa, che avvia l'applicazione Web sfogliando file:///path/to/app/index.html
.
La prima cosa che abbiamo provato è stata chiedere al nostro cliente di impostare Access-Control-Allow-Origin: *
nell'intestazione della risposta per consentire CORS. Abbiamo poi provato inviare al server:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback
});
monitoraggio delle richieste, era evidente che i biscotti non erano stati inclusi. Ad un'ispezione più ravvicinata c'è un special section in the CORS spec for dealing with user credentials, che include i cookie di sessione. Così ho modificato la chiamata AJAX per includere questo:
$.ajax({
url: 'http://thirdparty.com/ws',
data: data,
type: "POST",
dataType: "JSON",
success: successCallback,
error: failedCallback,
xhrFields { withCredentials: true }
});
Un altro errore, questa volta dal browser. Più lettura ha prodotto il seguente:
Se il server di terze parti non ha risposto con un colpo di testa
Access-Control-Allow-Credentials: true
la risposta sarebbe stata ignorata e non messi a disposizione di contenuti web.Nota importante: quando si risponde a una richiesta con credenziali, il server deve specificare un dominio nell'intestazione
Access-Control-Allow-Origin
e non può utilizzare jolly.
così abbiamo bisogno di cambiare le intestazioni del server per includere Access-Control-Allow-Credentials: true
e Access-Control-Allow-Origin
alla nostra origine.
Eccoci finalmente al mio problema: when loading a web page using the file:// protocol, l'intestazione della richiesta Origin
inviata da Web View è impostata su null
. Pertanto non può essere analizzato dal server e quindi il server non può impostarlo in Access-Control-Allow-Origin
. Ma se il server non è in grado di impostare Access-Control-Allow-Origin
su un valore diverso da *
, non è possibile inviare credenziali, inclusi i cookie.
Quindi sono bloccato. Cosa fare? I saw a similar question posted here ma non capisco davvero la risposta proposta. Qualsiasi aiuto sarebbe molto apprezzato!
L'unica soluzione mi viene in mente potrebbe essere quella di utilizzare un server per colpire il servizio web. Puoi scrivere un gestore HTTP e cliccarlo dalla tua app mobile. Ovviamente questo aggiunge un overhead aggiuntivo nella manutenzione del server, ma devi avere qualcosa a disposizione, no? –
Sì, questa è la soluzione provvisoria, un brutto gateway intermedio php phet. Non è davvero l'ideale, ma almeno funziona per il momento. – fiznool
Una cosa che potrei fare è chiedere agli sviluppatori di phonegap se hanno già visto qualcosa di simile prima e avere qualche soluzione ... – fiznool