HttpClient Basic Authentication

1. Áttekintés

Ez az oktatóanyag bemutatja, hogyan kell konfigurálja az alapvető hitelesítést az Apache HttpClient 4 alkalmazásban.

Ha mélyebbre akarsz ásni, és további jó dolgokat akarsz megtudni, amit a HttpClient-nel tehetsz - menj tovább a fő HttpClient oktatóanyag.

2. Alapvető hitelesítés az API-val

Kezdjük azzal a HttpClient alapszintű hitelesítésének konfigurálásának szokásos módja - a segítségével CredentialsProvider:

CredentialsProvider szolgáltató = new BasicCredentialsProvider (); UsernamePasswordCredentials hitelesítő adatok = new UsernamePasswordCredentials ("user1", "user1Pass"); szolgáltató.setCredentials (AuthScope.ANY, hitelesítő adatok); HttpClient kliens = HttpClientBuilder.create () .setDefaultCredentialsProvider (szolgáltató) .build (); HttpResponse response = client.execute (új HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION)); int statusCode = response.getStatusLine () .getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Mint láthatjuk, az ügyfél létrehozása hitelesítő adatok szolgáltatóval az alap hitelesítéssel történő beállításához nem nehéz.

Most, hogy megértsük, mit HttpClient a színfalak mögött fog tenni, meg kell néznünk a naplókat:

# ... kérést hitelesítő adatok nélkül küldünk [main] DEBUG ... - Hitelesítés szükséges [main] DEBUG ... - localhost: 8080 hitelesítést kért [main] DEBUG ... - Hitelesítési sémák preferencia sorrendben: tárgyalás, Kerberos, NTLM, Digest, Basic] [main] DEBUG ... - A tárgyalási hitelesítési séma kihívása nem érhető el [main] DEBUG ... - Kihívás a Kerberos hitelesítési sémára nem érhető el [main] DEBUG ... - Kihívás Az NTLM hitelesítési séma nem érhető el [main] DEBUG ... - Challenge for Digest hitelesítési séma nem érhető el [main] DEBUG ... - Kiválasztott hitelesítési lehetőségek: [BASIC] # ... a kérést újra elküldik - hitelesítő adatokkal

Az egész Az ügyfél-szerver kommunikáció most már tiszta:

  • az ügyfél elküldi a HTTP kérést hitelesítő adatok nélkül
  • a szerver visszaküldi a kihívást
  • az Ügyfél tárgyalásokat folytat és azonosítja a megfelelő hitelesítési rendszert
  • az Ügyfél elküldi egy második kérés, ezúttal hitelesítő adatokkal

3. Megelőző alapvető hitelesítés

A dobozon kívül a HttpClient nem végez megelőző hitelesítést. Ehelyett ennek kifejezetten az ügyfél által hozott döntésnek kell lennie.

Első, létre kell hoznunk a HttpContext - előzetes feltöltése hitelesítési gyorsítótárral előre kiválasztott megfelelő típusú hitelesítési sémával. Ez azt jelenti, hogy az előző példa szerinti tárgyalásra már nincs szükség - Az alap hitelesítés már kiválasztva:

HttpHost targetHost = új HttpHost ("localhost", 8082, "http"); CredentialsProvider credsProvider = új BasicCredentialsProvider (); credsProvider.setCredentials (AuthScope.ANY, új UsernamePasswordCredentials (DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = új BasicAuthCache (); authCache.put (targetHost, új BasicScheme ()); // AuthCache hozzáadása a végrehajtási környezethez HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credsProvider); context.setAuthCache (authCache);

Most már használhatjuk a klienst az új kontextussal és küldje el az előzetes hitelesítési kérelmet:

HttpClient kliens = HttpClientBuilder.create (). Build (); válasz = client.execute (új HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION), összefüggés); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Nézzük meg a naplókat:

[main] DEBUG ... - A gyorsítótárazott 'basic' hitelesítési séma újrafelhasználása a // localhost számára: 8082 [main] DEBUG ... - A GET / spring-security-rest-basic-auth / api / foos / 1 kérés végrehajtása HTTP / 1.1 [main] DEBUG ... >> GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... >> Host: localhost: 8082 [main] DEBUG ... >> Engedélyezés: Basic dXNlcjE6dXNlcjFQYXNz [main] DEBUG ... << HTTP / 1.1 200 OK [main] DEBUG ... - A hitelesítés sikeres

Minden rendben van:

  • az „Alapvető hitelesítés” séma előre van kiválasztva
  • a kérést a Engedélyezés fejléc
  • a szerver a-val válaszol 200 OK
  • A hitelesítés sikeres

4. Alapvető hitelesítés nyers HTTP fejlécekkel

A megelőző alapvető hitelesítés alapvetően a Engedélyezés fejléc.

Tehát ahelyett, hogy áttekinteném a meglehetősen összetett előző példát a beállításához, átvehetjük ennek a fejlécnek az irányítását és kézzel elkészíthetjük:

HttpGet request = új HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION); Karakterlánc hitelesítése = DEFAULT_USER + ":" + DEFAULT_PASS; byte [] encodedAuth = Base64.encodeBase64 (auth.getBytes (StandardCharsets.ISO_8859_1)); String authHeader = "Basic" + új String (encodedAuth); request.setHeader (HttpHeaders.AUTHORIZATION, authHeader); HttpClient kliens = HttpClientBuilder.create (). Build (); HttpResponse response = client.execute (kérés); int statusCode = response.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Ellenőrizzük, hogy ez megfelelően működik-e:

[main] DEBUG ... - Azonosító gyorsítótár nincs beállítva a [main] DEBUG kontextusban - Kapcsolat megnyitása {} -> // localhost: 8080 [main] DEBUG ... - Csatlakozás localhost / 127.0.0.1: 8080 [main] DEBUG ... - GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - Proxy hitelesítési állapot: UNCHALLENGED [main] DEBUG .. . - http-outgoing-0 >> GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - http-outgoing-0 >> Engedélyezés: Basic dXNlcjE6dXNlcjFQYXNz [main ] DEBUG ... - http-outgoing-0 << HTTP / 1.1 200 OK

Tehát, bár nincs hitelesítő gyorsítótár, Az alapvető hitelesítés továbbra is megfelelően működik, és megkapjuk 200 OK.

5. Következtetés

Ez a cikk az Apache HttpClient 4 segítségével az alapvető hitelesítés beállításának és használatának különböző módjait szemlélteti.

Mint mindig, az ebben a cikkben bemutatott kód elérhető a Github oldalon. Ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.