Autenticazione con HttpUrlConnection

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Panoramica

In questo tutorial, esploreremo come autenticare le richieste HTTP usando la classe HttpUrlConnection .

2. Autenticazione HTTP

Nelle applicazioni web, i server possono richiedere ai client di autenticarsi. In caso di mancata conformità, di solito il server restituisce un codice di stato HTTP 401 (non autorizzato).

Esistono più schemi di autenticazione che differiscono per il livello di sicurezza che forniscono. Tuttavia, anche lo sforzo di implementazione varia.

Vediamone tre:

  • basic è uno schema di cui parleremo meglio nella prossima sezione
  • digest applica algoritmi hash sulle credenziali utente e un nonce specificato dal server
  • bearer utilizza i token di accesso come parte di OAuth 2.0

3. Autenticazione di base

L'autenticazione di base consente ai client di autenticarsi utilizzando un nome utente e una password codificati tramite l' intestazione di autorizzazione :

GET / HTTP/1.1 Authorization: Basic dXNlcjpwYXNzd29yZA==

Per creare il nome utente codificato e la stringa della password, abbiamo semplicemente codificato in Base64 il nome utente, seguito da due punti, seguito dalla password:

basic(user, pass) = base64-encode(user + ":" + pass)

Ricorda però alcune precauzioni da RFC 7617:

Questo schema non è considerato un metodo sicuro di autenticazione dell'utente a meno che non venga utilizzato insieme a un sistema sicuro esterno come TLS

Questo, ovviamente, poiché il nome utente e la password viaggiano come testo normale sulla rete all'interno di ogni richiesta.

4. Autenticare una connessione

Ok, con questo come sfondo, passiamo alla configurazione di HttpUrlConnection per utilizzare HTTP Basic.

La classe HttpUrlConnection può inviare richieste, ma prima dobbiamo ottenerne un'istanza da un oggetto URL:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

Una connessione offre molti metodi per configurarla, come setRequestMethod e setRequestProperty.

Per quanto setRequestProperty suoni, questo è quello che vogliamo.

Dopo aver unito il nome utente e la password utilizzando ":", possiamo utilizzare la classe java.util.Base64 per codificare le credenziali:

String auth = user + ":" + password; byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));

Quindi, creiamo il valore dell'intestazione dal letterale "Basic" seguito dalle credenziali codificate:

String authHeaderValue = "Basic " + new String(encodedAuth);

Successivamente, chiamiamo il metodo setRequestProperty (chiave, valore) per autenticare la richiesta. Come accennato in precedenza, dobbiamo utilizzare "Autorizzazione" come intestazione e "Base" + credenziali codificate come valore:

connection.setRequestProperty("Authorization", authHeaderValue);

Infine, dobbiamo effettivamente inviare la richiesta HTTP, come ad esempio chiamando getResponseCode () . Di conseguenza, otteniamo un codice di risposta HTTP dal server:

int responseCode = connection.getResponseCode();

Qualunque cosa nella famiglia 2xx significa che la nostra richiesta, inclusa la parte di autenticazione, era a posto!

5. Java Authenticator

L'implementazione dell'autenticazione di base sopra menzionata richiede l'impostazione dell'intestazione di autorizzazione per ogni richiesta. Al contrario, la classe astratta java.net.Authenticator consente di impostare l'autenticazione a livello globale per tutte le connessioni .

Dobbiamo prima estendere la classe. Quindi, chiamiamo il metodo statico Authenticator.setDefault () per registrare un'istanza del nostro autenticatore:

Authenticator.setDefault(new BasicAuthenticator());

La nostra classe di autenticazione di base sostituisce semplicemente il metodo non astratto getPasswordAuthentication () della classe di base:

private final class BasicAuthenticator extends Authenticator { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password.toCharArray()); } }

La classe Authenticator utilizza le credenziali del nostro autenticatore per soddisfare automaticamente lo schema di autenticazione richiesto dal server.

6. Conclusione

In questo breve tutorial, abbiamo visto come applicare l'autenticazione di base alle richieste inviate tramite HttpUrlConnection .

Come sempre, l'esempio di codice può essere trovato su GitHub.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO