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.