Nella mia app faccio chiamate HTTP a un servizio web su HTTPS. Il mio desiderio è di progettare il mio cliente in modo tale da chiedere all'utente solo il nome utente e la password quando c'è una richiesta di autenticazione. Voglio essere reattivo, non preventivo. A causa della natura della mia app, ci sono alcuni casi in cui non è necessario autenticarsi.Come rispondere alle sfide di autenticazione HTTP in Android
In iOS, questo processo è reso molto semplice tramite il NSURLConnectionDelegateProtocol, che è implementato nella versione iOS della mia app. Viene effettuata una connessione utilizzando questa classe e solo quando viene presentata una sfida la classe chiede al suo delegato le credenziali di autenticazione.
Come può essere fatto in Android? Utilizzando lo AuthenticationHandler? O forse lo Authenticator? In tal caso, potrebbe essere fornito un esempio o un tutorial?
Edit 1:
Uso della classe Authenticator (vedi la mia risposta qui sotto) sono ora in grado di rispondere alle sfide di autenticazione, ma attualmente solo con le credenziali hard-coded. Voglio chiedere all'utente un nome utente e una password. Secondo lo Android documentation, all'interno del metodo getPasswordAuthentication
"si richiede di solito all'utente l'input richiesto".
Com'è possibile? Senza bloccare il thread dell'interfaccia utente, che so non può/non deve essere eseguito, come è possibile visualizzare una finestra di dialogo, attendere l'input dell'utente, quindi recuperare le credenziali immesse e restituirle, tutte all'interno di tale metodo?
Edit 2:
Mentre ci sono poche o nessuna esempi sull'uso della classe Authenticator, quello che ho potuto trovare suggerisce che richiede all'utente per l'input è impossibile all'interno di un singolo metodo, come getPasswordAuthentication
. Potrebbe essere necessario ripristinare il client HTTP Apache ...
finale Edit:
sto ancora utilizzando HttpURLConnection, ma fare qualcosa sulla falsariga di ciò che Edward ha suggerito di seguito. Non sembra esserci alcuna classe configurabile per gestire le sfide di autenticazione e richiedere all'utente l'input, quindi lo faccio manualmente.
Sto anche tentando di utilizzare java.net, poiché sembra che sia l'opzione più supportata in futuro. Proverò ciò che hai suggerito. Hai mai provato a usare la classe Authenticator? – Groppe
Vedere le mie modifiche sopra. –
Grazie. Da quello che ho letto, l'apertura di una finestra di dialogo (quello che voglio fare) non è possibile all'interno del metodo getPasswordAuthentication dell'autenticatore, sfortunatamente. – Groppe