Základné autentifikácia HttpClient

1. Prehľad

Tento návod ilustruje, ako na to nakonfigurujte základné overenie na serveri Apache HttpClient 4.

Ak sa chcete prehĺbiť a naučiť sa ďalšie super veci, ktoré môžete s HttpClient robiť - choďte ďalej hlavný návod HttpClient.

2. Základné overenie pomocou API

Začnime s štandardný spôsob konfigurácie základného overenia na HttpClient - prostredníctvom a Poskytovateľ poverení:

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

Ako vidíme, vytvorenie klienta s poskytovateľom poverení na nastavenie základného overenia nie je ťažké.

Teraz, aby sme pochopili čo HttpClient bude skutočne robiť v zákulisí, budeme sa musieť pozrieť na protokoly:

# ... žiadosť sa odosiela bez poverení [hlavné] DEBUG ... - vyžaduje sa autentifikácia [hlavné] DEBUG ... - localhost: 8080 požadované overenie [hlavné] DEBUG ... - autentifikačné schémy v preferenčnom poradí: [ vyjednávať, Kerberos, NTLM, Digest, základné] [hlavné] DEBUG ... - Výzva pre schému autentifikácie vyjednávania nie je k dispozícii [hlavné] DEBUG ... - Výzva pre schému autentifikácie Kerberos nie je k dispozícii [hlavné] DEBUG ... - Výzva pre Schéma autentifikácie NTLM nie je k dispozícii [hlavné] DEBUG ... - Výzva pre autentifikačnú schému Digest nie je k dispozícii [hlavné] DEBUG ... - Vybrané možnosti autentifikácie: [ZÁKLADNÉ] # ... požiadavka je odoslaná znova - s povereniami

Celá Komunikácia klient-server je teraz jasná:

  • klient pošle požiadavku HTTP bez prihlasovacích údajov
  • server pošle späť výzvu
  • klient vyjedná a identifikuje správnu schému autentifikácie
  • klient pošle druhá požiadavka, tentokrát s povereniami

3. Preventívne základné overenie

Po vybalení z krabice HttpClient nerobí preventívne overovanie. Namiesto toho musí ísť o výslovné rozhodnutie klienta.

Najprv, musíme vytvoriť HttpContext - predvyplniť ho autentifikačnou medzipamäťou s vopred vybraným správnym typom schémy autentifikácie. To bude znamenať, že rokovania z predchádzajúceho príkladu už nie sú potrebné - Základné overenie je už vybrané:

HttpHost targetHost = nový HttpHost ("localhost", 8082, "http"); CredentialsProvider credsProvider = nový BasicCredentialsProvider (); credsProvider.setCredentials (AuthScope.ANY, nové UsernamePasswordCredentials (DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = nový BasicAuthCache (); authCache.put (targetHost, nový BasicScheme ()); // Pridať AuthCache do kontextu vykonávania HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credsProvider); context.setAuthCache (authCache);

Teraz môžeme klienta použiť v novom kontexte a poslať požiadavku na predbežnú autentifikáciu:

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

Pozrime sa na protokoly:

[main] DEBUG ... - Opätovné použitie „základnej“ schémy autentifikácie pre // localhost: 8082 [main] DEBUG ... - vykonanie požiadavky 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 ... >> Hostiteľ: localhost: 8082 [main] DEBUG ... >> Autorizácia: Základné dXNlcjE6dXNlcjFQYXNz [hlavné] DEBUG ... << HTTP / 1,1 200 OK [hlavné] DEBUG ... - Overenie bolo úspešné

Všetko vyzerá dobre:

  • je vopred vybraná schéma „Základné overenie“
  • žiadosť sa zasiela spolu s Povolenie hlavička
  • server odpovie a 200 OK
  • Autentifikácia je úspešná

4. Základné overenie so surovými hlavičkami HTTP

Preventívne základné overenie v zásade znamená predbežné odoslanie Povolenie hlavička.

Namiesto nastavenia predchádzajúceho zložitého predchádzajúceho príkladu teda môžeme prevziať kontrolu nad touto hlavičkou a zostaviť ju ručne:

HttpGet request = nový HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION); Reťazec auth = DEFAULT_USER + ":" + DEFAULT_PASS; byte [] encodedAuth = Base64.encodeBase64 (auth.getBytes (StandardCharsets.ISO_8859_1)); Reťazec authHeader = "Základné" + nový reťazec (encodedAuth); request.setHeader (HttpHeaders.AUTHORIZATION, authHeader); HttpClient client = HttpClientBuilder.create (). Build (); HttpResponse response = client.execute (požiadavka); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Uistite sa, že to funguje správne:

[main] DEBUG ... - medzipamäť autentifikácie nie je nastavená v kontexte [main] DEBUG ... - otvára sa pripojenie {} -> // localhost: 8080 [main] DEBUG ... - pripája sa k localhost / 127.0.0.1: 8080 [main] DEBUG ... - vykonanie požiadavky GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - stav proxy servera: UNCHALLENGED [main] DEBUG .. . - http-outgoing-0 >> GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - http-outgoing-0 >> Autorizácia: Basic dXNlcjE6dXNlcjFQYXNz [main ] DEBUG ... - http-odchádzajúce-0 << HTTP / 1,1 200 OK

Aj keď teda neexistuje žiadna cache cache, Základné overenie stále funguje správne a dostávame 200 OK.

5. Záver

Tento článok ilustroval rôzne spôsoby nastavenia a používania základného overovania pomocou servera Apache HttpClient 4.

Ako vždy, kód uvedený v tomto článku je k dispozícii na stránkach Github. Toto je projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.