HttpClient basisverificatie

1. Overzicht

Deze tutorial laat zien hoe configureer basisverificatie op de Apache HttpClient 4.

Als je dieper wilt graven en andere coole dingen wilt leren die je kunt doen met de HttpClient - ga dan naar de belangrijkste HttpClient-zelfstudie.

2. Basisverificatie met de API

Laten we beginnen met de standaardmanier voor het configureren van basisverificatie op de HttpClient - via een CredentialsProvider:

CredentialsProvider provider = nieuwe BasicCredentialsProvider (); UsernamePasswordCredentials credentials = nieuwe UsernamePasswordCredentials ("user1", "user1Pass"); provider.setCredentials (AuthScope.ANY, referenties); HttpClient-client = HttpClientBuilder.create () .setDefaultCredentialsProvider (provider) .build (); HttpResponse response = client.execute (nieuwe HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION)); int statusCode = response.getStatusLine () .getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Zoals we kunnen zien, is het niet moeilijk om de client te maken met een inloggegevensprovider om deze in te stellen met basisverificatie.

Nu, om te begrijpen wat HttpClient zal echt achter de schermen doen, we zullen naar de logboeken moeten kijken:

# ... verzoek wordt verzonden zonder inloggegevens [hoofd] DEBUG ... - Authenticatie vereist [hoofd] DEBUG ... - localhost: 8080 aangevraagde authenticatie [hoofd] DEBUG ... - Authenticatieschema's in de volgorde van voorkeur: [ onderhandelen, Kerberos, NTLM, Digest, Basic] [hoofd] DEBUG ... - Uitdaging voor onderhandelingsverificatieschema niet beschikbaar [hoofd] DEBUG ... - Uitdaging voor Kerberos-verificatieschema niet beschikbaar [hoofd] DEBUG ... - Uitdaging voor NTLM-authenticatieschema niet beschikbaar [hoofd] DEBUG ... - Uitdaging voor Digest-authenticatieschema niet beschikbaar [hoofd] DEBUG ... - Geselecteerde authenticatie-opties: [BASIC] # ... het verzoek wordt opnieuw verzonden - met inloggegevens

De hele Client-server-communicatie is nu duidelijk:

  • de klant verstuurt het HTTP-verzoek zonder inloggegevens
  • de server stuurt een uitdaging terug
  • de klant onderhandelt en identificeert het juiste authenticatieschema
  • de klant stuurt een tweede verzoek, dit keer met inloggegevens

3. Preventieve basisverificatie

De HttpClient doet geen preventieve authenticatie. In plaats daarvan moet dit een expliciete beslissing zijn van de klant.

Eerste, we moeten het HttpContext - het vooraf invullen met een authenticatiecache met het juiste type authenticatieschema voorgeselecteerd. Dit betekent dat de onderhandeling uit het vorige voorbeeld niet langer nodig is - Basisverificatie is al gekozen:

HttpHost targetHost = nieuwe HttpHost ("localhost", 8082, "http"); CredentialsProvider credsProvider = nieuwe BasicCredentialsProvider (); credsProvider.setCredentials (AuthScope.ANY, nieuwe UsernamePasswordCredentials (DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = nieuwe BasicAuthCache (); authCache.put (targetHost, nieuwe BasicScheme ()); // Voeg AuthCache toe aan de uitvoeringscontext HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credsProvider); context.setAuthCache (authCache);

Nu kunnen we de client gebruiken met de nieuwe context en stuur het pre-authenticatieverzoek:

HttpClient-client = HttpClientBuilder.create (). Build (); response = client.execute (nieuwe HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION), context); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Laten we naar de logboeken kijken:

[main] DEBUG ... - Hergebruik van cached 'basic' auth-schema voor // localhost: 8082 [main] DEBUG ... - Verzoek uitvoeren GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... >> GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... >> Host: localhost: 8082 [main] DEBUG ... >> Autorisatie: Basic dXNlcjE6dXNlcjFQYXNz [main] DEBUG ... << HTTP / 1.1 200 OK [main] DEBUG ... - Authenticatie geslaagd

Alles ziet er OK uit:

  • het "Basic Authentication" -schema is voorgeselecteerd
  • het verzoek wordt verzonden met de Autorisatie koptekst
  • de server antwoordt met een 200 OK
  • Authenticatie is gelukt

4. Basisverificatie met onbewerkte HTTP-headers

Preventieve basisauthenticatie betekent in feite het vooraf verzenden van het Autorisatie koptekst.

Dus in plaats van door het nogal complexe vorige voorbeeld te gaan om het op te zetten, we kunnen deze header overnemen en met de hand construeren:

HttpGet-aanvraag = nieuwe HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION); String auth = DEFAULT_USER + ":" + DEFAULT_PASS; byte [] encodedAuth = Base64.encodeBase64 (auth.getBytes (StandardCharsets.ISO_8859_1)); String authHeader = "Basic" + nieuwe String (encodedAuth); request.setHeader (HttpHeaders.AUTHORIZATION, authHeader); HttpClient-client = HttpClientBuilder.create (). Build (); HttpResponse response = client.execute (verzoek); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Laten we ervoor zorgen dat dit correct werkt:

[main] DEBUG ... - Auth cache niet ingesteld in de context [main] DEBUG ... - Verbinding openen {} -> // localhost: 8080 [main] DEBUG ... - Verbinding maken met localhost / 127.0.0.1: 8080 [main] DEBUG ... - Verzoek uitvoeren GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - Proxy auth state: UNCHALLENGED [main] DEBUG .. . - http-outgoing-0 >> GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - http-outgoing-0 >> Autorisatie: Basic dXNlcjE6dXNlcjFQYXNz [main ] DEBUG ... - http-uitgaande-0 << HTTP / 1.1 200 OK

Dus ook al is er geen auth-cache, Basisauthenticatie werkt nog steeds correct en we ontvangen 200 OK.

5. Conclusie

Dit artikel illustreert verschillende manieren om basisverificatie in te stellen en te gebruiken met de Apache HttpClient 4.

Zoals altijd is de code die in dit artikel wordt gepresenteerd, beschikbaar op Github. Dit is een op Maven gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.


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