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.