HttpClient osnovna provjera autentičnosti

1. Pregled

Ovaj vodič ilustrirat će kako konfigurirajte osnovnu provjeru autentičnosti na Apache HttpClientu 4.

Ako želite dublje kopati i naučiti druge cool stvari koje možete učiniti s HttpClientom, krenite na glavni vodič za HttpClient.

2. Osnovna provjera autentičnosti pomoću API-ja

Krenimo od standardni način konfiguriranja osnovne provjere autentičnosti na HttpClientu - putem a CredentialsProvider:

CredentialsProvider provider = novi BasicCredentialsProvider (); Vjerodajnice za korisničko imePasswordCredentials = novo korisničko imePasswordCredentials ("user1", "user1Pass"); provider.setCredentials (AuthScope.ANY, vjerodajnice); HttpClient klijent = HttpClientBuilder.create () .setDefaultCredentialsProvider (dobavljač) .build (); HttpResponse odgovor = client.execute (novi HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION)); int statusCode = response.getStatusLine () .getStatusCode (); assertThat (statusCode, jednakTo (HttpStatus.SC_OK));

Kao što vidimo, stvaranje klijenta s davateljem vjerodajnica za postavljanje s osnovnom autentifikacijom nije teško.

Sada, da shvatim što HttpClient zapravo raditi iza kulisa, morat ćemo pogledati zapisnike:

# ... zahtjev se šalje bez vjerodajnica [main] DEBUG ... - Potrebna je provjera autentičnosti [main] DEBUG ... - localhost: 8080 zatražena provjera autentičnosti [main] DEBUG ... - Sheme provjere autentičnosti prema redoslijedu po želji: pregovarati, Kerberos, NTLM, Digest, Basic] [main] DEBUG ... - Izazov za shemu provjere autentičnosti nije dostupan [main] DEBUG ... - Izazov za shemu provjere autentičnosti Kerberos nije dostupan [main] DEBUG ... - Challenge for NTLM shema autentifikacije nije dostupna [glavna] DEBUG ... - Izazov za Digest shemu autentifikacije nije dostupna [glavna] DEBUG ... - Odabrane opcije provjere autentičnosti: [BASIC] # ... zahtjev se ponovno šalje - s vjerodajnicama

Cijela Komunikacija klijent-poslužitelj sada je jasna:

  • klijent šalje HTTP zahtjev bez vjerodajnica
  • server vraća izazov
  • klijent pregovara i identificira pravu shemu provjere autentičnosti
  • klijent šalje drugi zahtjev, ovaj put s vjerodajnicama

3. Preventivna osnovna provjera autentičnosti

Iz kutije, HttpClient ne vrši preventivnu autentifikaciju. Umjesto toga, ovo mora biti izričita odluka koju donosi klijent.

Prvi, moramo stvoriti HttpContext - prethodno ga popunjava predmemorijom provjere autentičnosti s unaprijed odabranom pravom vrstom sheme provjere autentičnosti. To će značiti da pregovori iz prethodnog primjera više nisu potrebni - Već je odabrana osnovna provjera autentičnosti:

HttpHost targetHost = novi HttpHost ("localhost", 8082, "http"); CredentialsProvider credsProvider = novi BasicCredentialsProvider (); credsProvider.setCredentials (AuthScope.ANY, novi UsernamePasswordCredentials (DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = novi BasicAuthCache (); authCache.put (targetHost, nova BasicScheme ()); // Dodajte AuthCache u kontekst izvršenja HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credsProvider); context.setAuthCache (authCache);

Sada klijenta možemo koristiti s novim kontekstom i poslati zahtjev za prethodnom provjerom autentičnosti:

HttpClient klijent = HttpClientBuilder.create (). Build (); response = client.execute (novi HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION), kontekst); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, jednakTo (HttpStatus.SC_OK));

Pogledajmo zapisnike:

[main] DEBUG ... - Ponovna upotreba predmemorirane 'osnovne' sheme autorizacije za // localhost: 8082 [main] DEBUG ... - Izvršavanje zahtjeva 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 ... >> Autorizacija: Osnovni dXNlcjE6dXNlcjFQYXNz [glavni] DEBUG ... << HTTP / 1.1 200 OK [glavni] DEBUG ... - Autentifikacija je uspjela

Sve izgleda u redu:

  • shema "Osnovna autentifikacija" je unaprijed odabrana
  • zahtjev se šalje s Ovlaštenje Zaglavlje
  • poslužitelj odgovara s 200 OK
  • Autentifikacija je uspjela

4. Osnovna autorizacija sa sirovim HTTP zaglavljima

Preemptive Basic Authentication u osnovi znači prethodno slanje Ovlaštenje Zaglavlje.

Dakle, umjesto da prođemo kroz prilično složeni prethodni primjer da bismo to postavili, možemo preuzeti kontrolu nad ovim zaglavljem i ručno ga konstruirati:

Zahtjev za HttpGet = novi HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION); Niz auth = DEFAULT_USER + ":" + DEFAULT_PASS; bajt [] encodedAuth = Base64.encodeBase64 (auth.getBytes (StandardCharsets.ISO_8859_1)); String authHeader = "Basic" + novi String (encodedAuth); request.setHeader (HttpHeaders.AUTHORIZATION, authHeader); HttpClient klijent = HttpClientBuilder.create (). Build (); HttpResponse odgovor = client.execute (zahtjev); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, jednakTo (HttpStatus.SC_OK));

Pobrinimo se da ovo ispravno radi:

[main] DEBUG ... - Autorska predmemorija nije postavljena u kontekstu [main] DEBUG ... - Otvaranje veze {} -> // localhost: 8080 [main] DEBUG ... - Povezivanje s localhost / 127.0.0.1: 8080 [main] DEBUG ... - izvršavanje zahtjeva 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 >> Autorizacija: Basic dXNlcjE6dXNlcjFQYXNz [main ] DEBUG ... - http-outgoing-0 << HTTP / 1.1 200 OK

Dakle, iako ne postoji autorska predmemorija, Osnovna autentifikacija i dalje radi ispravno i primamo 200 OK.

5. Zaključak

Ovaj je članak ilustrirao različite načine postavljanja i korištenja osnovne provjere autentičnosti s Apache HttpClient 4.

Kao i uvijek, kôd predstavljen u ovom članku dostupan je na Githubu. Ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.