HttpClient Grundlæggende godkendelse

1. Oversigt

Denne vejledning illustrerer, hvordan man gør det konfigurer grundlæggende godkendelse på Apache HttpClient 4.

Hvis du vil grave dybere og lære andre seje ting, kan du gøre med HttpClient - gå videre til den vigtigste HttpClient-tutorial.

2. Grundlæggende godkendelse med API

Lad os starte med standardmetoden til konfiguration af grundlæggende godkendelse på HttpClient - via en CredentialsProvider:

CredentialsProvider-udbyder = ny BasicCredentialsProvider (); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials ("user1", "user1Pass"); provider.setCredentials (AuthScope.ANY, legitimationsoplysninger); HttpClient-klient = HttpClientBuilder.create () .setDefaultCredentialsProvider (udbyder) .build (); HttpResponse respons = client.execute (ny HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION)); int statusCode = respons.getStatusLine () .getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Som vi kan se, er det ikke svært at oprette klienten med en legitimationsudbyder for at konfigurere den med grundlæggende godkendelse.

Nu for at forstå hvad HttpClient faktisk gør bag kulisserne, bliver vi nødt til at se på logfilerne:

# ... anmodning sendes uden legitimationsoplysninger [main] DEBUG ... - Godkendelse krævet [main] DEBUG ... - localhost: 8080 anmodet om godkendelse [main] DEBUG ... - Authentication ordninger i rækkefølgen af ​​præference: [ forhandle, Kerberos, NTLM, Digest, Basic] [main] DEBUG ... - Udfordring til forhandlingsgodkendelsesplan ikke tilgængelig [main] DEBUG ... - Challenge for Kerberos authentication scheme not available [main] DEBUG ... - Challenge for NTLM-godkendelsesplan ikke tilgængelig [main] DEBUG ... - Challenge for Digest authentication-ordning ikke tilgængelig [main] DEBUG ... - Valgte godkendelsesindstillinger: [BASIC] # ... anmodningen sendes igen - med legitimationsoplysninger

Hele Klient-server kommunikation er nu klar:

  • klienten sender HTTP-anmodningen uden legitimationsoplysninger
  • Serveren sender en udfordring tilbage
  • Kunden forhandler og identificerer den rigtige godkendelsesplan
  • klienten sender en anden anmodning, denne gang med legitimationsoplysninger

3. Forebyggende grundlæggende godkendelse

Ud af kassen, den HttpClient gør ikke forebyggende godkendelse. I stedet for skal dette være en eksplicit beslutning truffet af klienten.

Først, vi er nødt til at skabe HttpContext - udfylde det med en godkendelsescache med den rigtige type godkendelsesplan, der er forvalgt. Dette betyder, at forhandlingerne fra det foregående eksempel ikke længere er nødvendige - Grundlæggende godkendelse er allerede valgt:

HttpHost targetHost = ny HttpHost ("localhost", 8082, "http"); CredentialsProvider credsProvider = ny BasicCredentialsProvider (); credsProvider.setCredentials (AuthScope.ANY, nyt brugernavnPasswordCredentials (DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = ny BasicAuthCache (); authCache.put (targetHost, ny BasicScheme ()); // Føj AuthCache til eksekveringskonteksten HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credsProvider); context.setAuthCache (authCache);

Nu kan vi bruge klienten med den nye kontekst og send anmodningen om forhåndsgodkendelse:

HttpClient-klient = HttpClientBuilder.create (). Build (); respons = client.execute (ny HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION), kontekst); int statusCode = respons.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Lad os se på logfiler:

[main] DEBUG ... - Genbrug af cachelagret 'basic' auth-ordning til // localhost: 8082 [main] DEBUG ... - Udførelsesanmodning 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 ... >> Autorisation: Grundlæggende dXNlcjE6dXNlcjFQYXNz [main] DEBUG ... << HTTP / 1.1 200 OK [main] DEBUG ... - Godkendelse lykkedes

Alt ser OK ud:

  • skemaet "Grundlæggende godkendelse" er forudvalgt
  • anmodningen sendes med Bemyndigelse header
  • Serveren svarer med en 200 OK
  • Godkendelse lykkes

4. Grundlæggende godkendelse med rå HTTP-overskrifter

Forebyggende grundlæggende godkendelse betyder grundlæggende forudsendelse af Bemyndigelse header.

Så i stedet for at gå igennem det ret komplekse tidligere eksempel for at konfigurere det, vi kan tage kontrol over dette header og konstruere det manuelt:

HttpGet anmodning = ny HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION); String auth = DEFAULT_USER + ":" + DEFAULT_PASS; byte [] encodedAuth = Base64.encodeBase64 (auth.getBytes (StandardCharsets.ISO_8859_1)); String authHeader = "Grundlæggende" + ny streng (encodedAuth); request.setHeader (HttpHeaders.AUTHORIZATION, authHeader); HttpClient-klient = HttpClientBuilder.create (). Build (); HttpResponse respons = client.execute (anmodning); int statusCode = respons.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

Lad os sikre os, at dette fungerer korrekt:

[main] DEBUG ... - Auth cache ikke indstillet i konteksten [main] DEBUG ... - Åbning af forbindelse {} -> // localhost: 8080 [main] DEBUG ... - Opretter forbindelse til localhost / 127.0.0.1: 8080 [main] DEBUG ... - Udførelsesanmodning GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - Proxy auth state: UNCHALLENGED [main] DEBUG .. . - http-udgående-0 >> GET / fjeder-sikkerhed-hvile-basic-auth / api / foos / 1 HTTP / 1.1 [hoved] DEBUG ... - http-udgående-0 >> Godkendelse: Grundlæggende dXNlcjE6dXNlcjFQYXNz [hoved ] AFBRUG ... - http-udgående-0 << HTTP / 1.1 200 OK

Så selvom der ikke er nogen auth-cache, Grundlæggende godkendelse fungerer stadig korrekt, og vi modtager 200 OK.

5. Konklusion

Denne artikel illustrerede forskellige måder at konfigurere og bruge grundlæggende godkendelse med Apache HttpClient 4 på.

Som altid er koden præsenteret i denne artikel tilgængelig på Github. Dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.