Authenticatie met HttpUrlConnection

Java Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

In deze zelfstudie gaan we onderzoeken hoe u HTTP-verzoeken kunt verifiëren met behulp van de HttpUrlConnection klasse.

2. HTTP-verificatie

In webtoepassingen kunnen servers vereisen dat clients zichzelf verifiëren. Het niet naleven ervan heeft meestal tot gevolg dat de server een HTTP 401-statuscode (ongeautoriseerd) retourneert.

Er zijn meerdere authenticatieschema's die verschillen in de beveiligingssterkte die ze bieden. De implementatie-inspanning varieert echter ook.

Laten we er drie bekijken:

  • basis is een schema waarover we in de volgende sectie meer zullen zeggen
  • verteren past hash-algoritmen toe op gebruikersreferenties en een server-gespecificeerde nonce
  • toonder maakt gebruik van toegangstokens als onderdeel van OAuth 2.0

3. Basisverificatie

Met basisverificatie kunnen clients zichzelf verifiëren met een gecodeerde gebruikersnaam en wachtwoord via de Autorisatie koptekst:

GET / HTTP / 1.1 Autorisatie: Basic dXNlcjpwYXNzd29yZA ==

Om de gecodeerde gebruikersnaam en wachtwoordreeks te maken, coderen we eenvoudig de gebruikersnaam met Base64, gevolgd door een dubbele punt, gevolgd door het wachtwoord:

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

Onthoud echter enige waarschuwing van RFC 7617:

Dit schema wordt niet beschouwd als een veilige methode voor gebruikersauthenticatie, tenzij het wordt gebruikt in combinatie met een extern beveiligd systeem zoals TLS

Dit komt natuurlijk doordat de gebruikersnaam en het wachtwoord binnen elk verzoek als platte tekst over het netwerk reizen.

4. Verifieer een verbinding

Oké, met dat als achtergrond, laten we beginnen met configureren HttpUrlConnection om HTTP Basic te gebruiken.

De klas HttpUrlConnection kan verzoeken verzenden, maar eerst moeten we een instantie ervan verkrijgen via een URL-object:

HttpURLConnection-verbinding = (HttpURLConnection) url.openConnection ();

Een verbinding biedt vele methoden om deze te configureren, zoals setRequestMethod en setRequestProperty.

Zo vreemd als setRequestProperty klinkt, dit is degene die we willen.

Zodra we de gebruikersnaam en het wachtwoord hebben samengevoegd met ":", kunnen we de java.util.Base64 class om de referenties te coderen:

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

Vervolgens maken we de headerwaarde van de letterlijke "Basic" gevolgd door de gecodeerde referenties:

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

Vervolgens noemen we de methode setRequestProperty (sleutel, waarde) om het verzoek te verifiëren. Zoals eerder vermeld, we moeten gebruiken "Autorisatie" als onze header en "Basic" + gecodeerde inloggegevens als onze waarde:

connection.setRequestProperty ("Autorisatie", authHeaderValue);

Ten slotte moeten we het HTTP-verzoek daadwerkelijk verzenden, bijvoorbeeld door te bellen getResponseCode (). Als resultaat krijgen we een HTTP-antwoordcode van de server:

int responseCode = connection.getResponseCode ();

Alles in de 2xx-familie betekent dat ons verzoek, inclusief het authenticatiegedeelte, in orde was!

5. Java Authenticator

De bovengenoemde basisauth-implementatie vereist het instellen van de autorisatieheader voor elk verzoek. In tegenstelling tot de abstracte klasse java.net.Authenticator staat toe de authenticatie globaal instellen voor alle verbindingen.

We moeten eerst de klas uitbreiden. Vervolgens noemen we de statische methode Authenticator.setDefault () om een ​​instantie van onze authenticator te registreren:

Authenticator.setDefault (nieuwe BasicAuthenticator ());

Onze basisauth-klasse overschrijft gewoon de getPasswordAuthentication () niet-abstracte methode van de basisklasse:

private laatste klasse BasicAuthenticator breidt Authenticator {beschermde PasswordAuthentication getPasswordAuthentication () {terug nieuwe PasswordAuthentication (gebruiker, password.toCharArray ()); }}

De Authenticator-klasse gebruikt de inloggegevens van onze authenticator om automatisch te voldoen aan het authenticatieschema dat door de server wordt vereist.

6. Conclusie

In deze korte zelfstudie hebben we gezien hoe u basisverificatie toepast op verzoeken die zijn verzonden via HttpUrlConnection.

Zoals altijd is het codevoorbeeld te vinden op GitHub.

Java onderkant

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

$config[zx-auto] not found$config[zx-overlay] not found