Java >> Java tutorial >  >> Tag >> HTTP

Godkendelse med HttpUrlConnection

1. Oversigt

I denne vejledning skal vi undersøge, hvordan man godkender HTTP-anmodninger ved hjælp af HttpUrlConnection klasse.

2. HTTP-godkendelse

I webapplikationer kan servere kræve, at klienter godkender sig selv. Manglende overholdelse resulterer normalt i, at serveren returnerer en HTTP 401 (uautoriseret) statuskode.

Der er flere godkendelsesordninger, der adskiller sig i den sikkerhedsstyrke, de giver. Implementeringsindsatsen varierer dog også.

Lad os se tre af dem:

  • grundlæggende er en ordning, som vi fortæller mere om i næste afsnit
  • fordøje anvender hash-algoritmer på brugerlegitimationsoplysninger og en server-specificeret nonce
  • bærer bruger adgangstokens som en del af OAuth 2.0

3. Grundlæggende godkendelse

Grundlæggende godkendelse giver klienter mulighed for at autentificere sig selv ved hjælp af et kodet brugernavn og adgangskode via Autorisation overskrift:

GET / HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd29yZA==

For at oprette den kodede brugernavn og adgangskodestreng, baserer vi ganske enkelt brugernavnet efterfulgt af et kolon efterfulgt af adgangskoden:

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

Husk dog en vis forsigtighed fra RFC 7617:

Denne ordning anses ikke for at være en sikker metode til brugergodkendelse, medmindre den bruges sammen med et eksternt sikkert system såsom TLS

Dette skyldes naturligvis, at brugernavnet og adgangskoden rejser som almindelig tekst over netværket inden for hver anmodning.

4. Godkend en forbindelse

Okay, med det som baggrund, lad os gå i gang med at konfigurere HttpUrlConnection at bruge HTTP Basic.

Klassen HttpUrlConnection kan sende anmodninger, men først skal vi hente en forekomst af det fra et URL-objekt:

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

En forbindelse tilbyder mange metoder til at konfigurere den, såsom setRequestMethod og setRequestProperty.

Så mærkeligt som setRequestProperty lyder, er det denne, vi vil have.

Når vi har tilsluttet brugernavnet og adgangskoden ved hjælp af ":", kan vi bruge java.util.Base64 klasse for at kode legitimationsoplysningerne:

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

Derefter opretter vi overskriftsværdien ud fra det bogstavelige "Basic" efterfulgt af de kodede legitimationsoplysninger:

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

Dernæst kalder vi metoden setRequestProperty(nøgle, værdi) for at autentificere anmodningen. Som tidligere nævnt skal vi bruge "Autorisation" som vores header og “Basic ” + kodede legitimationsoplysninger som vores værdi:

connection.setRequestProperty("Authorization", authHeaderValue);

Endelig skal vi faktisk sende HTTP-anmodningen, som for eksempel ved at kalde getResponseCode() . Som et resultat får vi en HTTP-svarkode fra serveren:

int responseCode = connection.getResponseCode();

Alt i 2xx-familien betyder, at vores anmodning inklusive godkendelsesdelen var okay!

5. Java Authenticator

Den ovennævnte grundlæggende godkendelsesimplementering kræver indstilling af autorisationshovedet for hver anmodning. I modsætning hertil er den abstrakte klasse java.net.Authenticator tillader indstilling af godkendelse globalt for alle forbindelser .

Vi skal udvide klassen først. Derefter kalder vi den statiske metode Authenticator.setDefault() for at registrere en forekomst af vores autentificering:

Authenticator.setDefault(new BasicAuthenticator());

Vores grundlæggende godkendelsesklasse tilsidesætter getPasswordAuthentication() ikke-abstrakt metode for basisklassen:

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

Authenticator-klassen bruger legitimationsoplysningerne fra vores autentificering til automatisk at opfylde den godkendelsesordning, der kræves af serveren.

6. Konklusion

I denne korte selvstudie har vi set, hvordan man anvender grundlæggende godkendelse på anmodninger sendt via HttpUrlConnection .

Som altid kan kodeeksemplet findes på GitHub.


Java tag