2015-09-22 25 views
12

Ho un'applicazione iOS che si autentica con l'API Uber utilizzando OAuth2 in un UIWebView. Quando eseguo l'aggiornamento a iOS 9, eseguo l'accesso al problema dell'ATS che blocca la richiesta https per la pagina di accesso. Ho quindi aggiunto un'eccezione per la pagina di accesso di Uber, ma ho notato che la pagina di accesso invia diverse altre richieste a Facebook, Amazon Web Services e altri siti Web, tutte bloccate da ATS.SFSafariViewController Rimuovi OAuth2 Cookie

Non desidero mantenere un elenco di eccezioni per la pagina di accesso Uber, poiché Uber può facilmente modificare la pagina e la mia app non avrà le eccezioni corrette. Così ho deciso di dare un colpo a SFSafariViewController.

Sono in grado di completare il processo OAuth2 con SFSafariViewController, il problema è che un qualche tipo di cookie viene memorizzato da Uber al completamento dell'autenticazione. Se voglio autenticare un altro account e richiama di nuovo lo SFSafariViewController, il cookie viene prelevato dall'autenticazione precedente e non vi è alcuna possibilità di autenticare un altro account. L'ho risolto con lo UIWebView eliminando il cookie tramite NSHTTPCookieStorage, ma non vedo un modo per eliminare il cookie da SFSafariViewController.

+0

Sei riuscito a risolvere questo? Sto vivendo lo stesso problema. – goldengil

+0

Non ho trovato una soluzione per rimuovere il cookie. In pratica ho modificato la mia app per revocare il token OAuth alla disconnessione, quindi il cookie OAuth memorizzato non era più valido. – duncanc4

risposta

0

Per iOS 9 e poi la scelta migliore è quella di utilizzare la classe WKWebView disponibile nel WebKit Framework

che fornisce un WKWebsiteDataStore che può essere utilizzato per eliminare i cookie/cache utilizzati dal WebView, si veda ad esempio: https://stackoverflow.com/a/31803708/313113 o https://stackoverflow.com/a/32491271/313113

Secondo la documentazione: SFSafariViewController azioni cookie e altri dati di siti web con Safari e perché si corre al di fuori del processo di vostra applicazione (per motivi di sicurezza) si possibile non modificare suo stato dalla propria applicazione. Vedere questa risposta: https://stackoverflow.com/a/34136074/313113 da qualcuno che ha contattato l'assistenza clienti di Apple ed ha ottenuto la seguente risposta:

SFSafariViewController corre al di fuori del mio processo di App e al fine da garantire la mia app non può modificare lo stato di SFSafariViewController. Nelle altre parole, la mia app non può cancellare le credenziali archiviate da S2.SFSafariViewController.

+2

'WKWebView' non funzionerà perché sarà necessario specificare un dominio per ogni richiesta HTTP creata dalla pagina di accesso di Uber. Dato che la pagina non è gestita da me e molto probabilmente cambierà, l'utilizzo delle eccezioni ATS si interromperà facilmente. Questo è il motivo per cui ho dovuto passare a 'SFSafariViewController'. – duncanc4

0

Quindi mi sono imbattuto in questo stesso problema e ho visto la tua domanda quando cercavo come risolvere questo. Nel mio caso la soluzione migliore che ho trovato è stata quella di fare il logout per l'app e poi di presentare un SFSafariViewController puntato sul nostro url di logout. Allora ho usato questo per chiudere la SFSafariViewController non appena si è fatto carico:

extension AlertsTableViewController: SFSafariViewControllerDelegate { 

    public func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) { 
     if controller == logoutSVC { 
      controller.dismiss(animated: false) 
     } 
    } 

} 

ho conservato lo SFSafariViewController in logoutSVC quindi ho solo eseguito questo codice se questo è lo SFSafariViewController logout. Nel tuo caso sembra che tu abbia appena fatto una chiamata API per revocare il token OAuth che è un po 'più bello dal momento che non viene mostrato all'utente, ma ciò è positivo per le istanze in cui non si dispone di tale accesso. Ancora una cosa, per qualche ragione ho dovuto chiamare il metodo di licenziamento (animato: falso) su SFSafariViewController invece di UIViewController attuale per qualche motivo. Mi ci è voluto un secondo per capire perché non funzionava per me.