2013-09-25 13 views
5

La mia organizzazione disponeva di un'app Web che funzionava perfettamente su iOS 6. Visitando il sito Web, il sito Web avrebbe richiesto di aggiungere la pagina alla schermata iniziale e il boom, una bella app Web HTML5 è stata aggiunta alla schermata principale.L'autenticazione HTTP nelle app Web iOS 7 non risponde

Poiché stiamo elaborando dati riservati, l'app Web ha utilizzato l'autenticazione HTTP (tramite la finestra di dialogo di autenticazione nativa WebKit) per autenticare gli utenti/passaggi. Ha funzionato senza intoppi fino a iOS 7. Ora, quando qualcuno tenta di richiamare la finestra di autenticazione HTTP, non succede nulla. È chiaramente provare per caricare qualcosa, come appare lo spinner nella barra di stato, ma non appare mai nessuna finestra di dialogo, in pratica si rompe la "app".

Qualcun altro ha incontrato questo? È qualcosa che potresti considerare un bug alla fine di Apple? Qualche soluzione?

+0

Hai provato a riprodurre questo problema? Almeno saprai se si tratta di un bug di Safari. – Pavlo

+0

Si verifica * solo * nelle app Web aggiunte alla schermata iniziale. Safari (l'app) gestisce correttamente la finestra di autenticazione, ma non riesco a farli funzionare nelle app Web. – oldwren

+1

Abbiamo riscontrato un comportamento simile, vedere la mia domanda http://stackoverflow.com/questions/18976407/broken-basic-authentication-in-web-apps-on-ios-7 –

risposta

1

Ho lo stesso identico problema. L'autenticazione di base ha funzionato con versioni precedenti di iOS ma non con iOS 7 in combinazione con le app Web aggiunte alla schermata iniziale. Penso che questo potrebbe essere correlato al problema di dialogo descritto here.

Le finestre di dialogo standard non funzionano affatto, come avviso, conferma o richiesta.

Il prompt di accesso che viene visualizzato per autenticare l'utente è probabilmente bloccato (non funziona o non è visibile) ed è per questo che l'app Web non passa attraverso la fase di autenticazione.

Suppongo che Apple dovrà risolvere questo bug in una versione futura.

Modifica: dopo l'aggiornamento a iOS 7.0.3, l'autenticazione di base ha iniziato a funzionare nuovamente anche in modalità di app Web della schermata principale. Viene visualizzata la richiesta di accesso e tutto funziona come previsto.

3

La mia azienda si è imbattuta in quest'ultimo autunno, a partire da iOS 6, e ciò che è stato possibile accertare è che si tratta di un vero bug di Apple Safari come parte dei suoi "miglioramenti" di sicurezza. Nessuna spiegazione reale da parte loro per motivi logici, ma ecco cosa vediamo negli sniffer di debug e pacchetti.

In condizioni normali, il browser Safari richiede una pagina (o un oggetto nella pagina) dal server su un GET. Se tale risorsa è protetta con una lista di controllo di accesso, nel nostro caso Apache Basic Auth, ed è la prima richiesta su quell'host nella sessione, il server risponderà con un'intestazione di risposta 401 HTTP che indica al client (il browser) che ha bisogno di richiedere nuovamente, questa volta aggiungendo un'intestazione di autenticazione di base con credenziali di autorizzazione. Il browser presenta quindi una finestra di dialogo di accesso all'utente, in cui è possibile immettere le credenziali dell'utente e del passaggio e inviare o annullare la richiesta. Al momento dell'invio, il client richiede nuovamente tali credenziali nell'intestazione auth.

Supponendo che le credenziali siano accettate nella seconda richiesta GET, nella risposta verrà restituito il bene appropriato e il documento nel browser procederà con il caricamento del resto della pagina (presupponendo che si trattasse di una pagina richiesta). Se si dispone di risorse incorporate che risiedono su un host diverso e tale host richiede l'autenticazione per tale risorsa, il processo viene ripetuto al caricamento della pagina.

Ecco dove si rompe. Se incorpori chiamate su oggetti da più di 2 host totali sulla stessa pagina, che richiedono l'autenticazione di base, la terza richiesta di autenticazione su quella pagina viene soppressa, quindi il browser gira per sempre in attesa che tu inserisca le credenziali su un prompt che non vedi mai . Il tuo browser Safari è ora bloccato su quella richiesta di autenticazione bloccata, su questa e qualsiasi altra scheda, anche su una ricarica, e non riceverai un altro prompt a meno che e fino a quando non chiudi il browser o riavvii il dispositivo.

Questo non ha effetto su Chrome, solo Safari, ed è sia su un iPhone che su un iPad con iOS 6 o successivo. Ho l'ultima versione di iOS al momento della stesura di questa (7.0.6), e il problema è ancora lì.

Abbiamo avuto una soluzione alternativa l'anno scorso, in cui avremmo creato una pagina interna con una matrice di ciascuno degli host incorporati, che avremmo poi collegato con un iframe che includeva una chiamata a favicon.ico nella posizione di quell'host . Ciò ha funzionato fino a poco tempo fa, dove ora, forse a causa della funzionalità di iOS 7 del congelamento delle schede di sfondo, i prompt di autenticazione sono di nuovo bloccati.

qui è stato il campione di JavaScript:

hosts=["store","profile","www","secure-store","images","m","modules"]; 
devhost=location.hostname; 
var i=0; 
while (hosts[i]) 
{ 
newhost=devhost.replace('store.mydomain',hosts[i]+'.mydomain'); 
document.write("<iframe Xhidden seamless=seamless width=0 height=0 src=http://"+newhost+"/favicon.ico><img height='16' width='20' alt='NOT' title='NOT AUTHENTICATED' src=http://"+newhost+"/favicon.ico> Authenticated on "+newhost+"</a></br></iframe>"); 
document.write("<img height='16' width='20' alt='NOT' title='NOT AUTHENTICATED' src="+(newhost.indexOf('secure')>0?'https://':'http://')+newhost+"/favicon.ico> Authenticated on "+newhost+"</a></br>"); 
i++; 
} 

Il secondo set nel document.write darebbe un'indicazione visiva di cui sono stati autenticati padroni di casa, come viene ora visualizzata la favicon. Ti consente anche di sapere quale host potrebbe essere bloccato, in quanto manca l'icona.

Poiché questa soluzione alternativa ha smesso di funzionare su iOS 7, l'unica soluzione ingombrante che abbiamo è quella di pre-aprire una scheda separata per ciascuna delle favicon (direttamente nell'URL), immettere l'auth, tornare indietro, passare alla successiva uno nella lista, e ripetere fino a quando non sono state memorizzate tutte le credenziali di autenticazione per tutti gli host utilizzati nella pagina. A quel punto, puoi caricare la pagina originale da quando i tuoi crediti sono ora memorizzati nella cache. Cruddy, e assolutamente irragionevole per un consumatore finale, ma è quello che dobbiamo fare per testare i siti che sono dietro una CDN pubblica, poiché abbiamo bisogno di proteggere le risorse su quel sito di sviluppo con un ACL.

A partire da oggi, stiamo ancora valutando una soluzione migliore. Non è un problema su Android, Windows o qualsiasi altro iOS.

Certo, ha funzionato meglio quando Jobs era vivo.

Spero che un po 'di questo aiuti.

Problemi correlati