HttpClient Grunnleggende godkjenning

1. Oversikt

Denne opplæringen vil illustrere hvordan du gjør det konfigurer grunnleggende autentisering på Apache HttpClient 4.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med HttpClient - gå videre til den viktigste HttpClient-opplæringen.

2. Grunnleggende autentisering med API

La oss starte med standard måten å konfigurere grunnleggende autentisering på HttpClient - via en Legitimasjonsleverandør:

CredentialsProvider-leverandør = ny BasicCredentialsProvider (); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials ("user1", "user1Pass"); provider.setCredentials (AuthScope.ANY, legitimasjon); HttpClient-klient = HttpClientBuilder.create () .setDefaultCredentialsProvider (leverandør) .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 vanskelig å opprette klienten hos en legitimasjonsleverandør for å konfigurere den med grunnleggende godkjenning.

Nå, for å forstå hva HttpClient faktisk gjør bak kulissene, må vi se på loggene:

# ... forespørsel sendes uten legitimasjon [main] DEBUG ... - Authentication required [main] DEBUG ... - localhost: 8080 anmodet om godkjenning [main] DEBUG ... - Authentication schemes in the order of preference: [ forhandle, Kerberos, NTLM, Digest, Basic] [main] DEBUG ... - Utfordring for forhandlingsautentiseringsskjema ikke tilgjengelig [main] DEBUG ... - Challenge for Kerberos authentication scheme not available [main] DEBUG ... - Challenge for NTLM-godkjenningsskjema ikke tilgjengelig [hoved] DEBUG ... - Utfordring for Digest-godkjenningsskjema ikke tilgjengelig [hoved] DEBUG ... - Valgte godkjenningsalternativer: [BASIC] # ... forespørselen sendes igjen - med legitimasjon

Hele Klient-server-kommunikasjon er nå klar:

  • klienten sender HTTP-forespørselen uten legitimasjon
  • serveren sender en utfordring tilbake
  • Kunden forhandler og identifiserer riktig godkjenningsskjema
  • klienten sender en ny forespørsel, denne gangen med legitimasjon

3. Forebyggende grunnleggende autentisering

Ut av esken, den HttpClient gjør ikke forhåndsgodkjenning. I stedet må dette være en eksplisitt beslutning tatt av klienten.

Først, vi trenger å lage HttpContext - forhåndsutfylle den med en autentiseringsbuffer med riktig type autentiseringsskjema valgt på forhånd. Dette vil bety at forhandlingene fra forrige eksempel ikke lenger er nødvendige - Grunnleggende godkjenning er allerede valgt:

HttpHost targetHost = ny HttpHost ("localhost", 8082, "http"); CredentialsProvider credsProvider = ny BasicCredentialsProvider (); credsProvider.setCredentials (AuthScope.ANY, nytt brukernavnPasswordCredentials (DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = ny BasicAuthCache (); authCache.put (targetHost, ny BasicScheme ()); // Legg til AuthCache i kjøringskonteksten HttpClientContext context = HttpClientContext.create (); context.setCredentialsProvider (credsProvider); context.setAuthCache (authCache);

Nå kan vi bruke klienten med den nye konteksten og send forespørsel om godkjenning:

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

La oss se på loggene:

[main] DEBUG ... - Gjenbruk av hurtigbufret 'grunnleggende' autentiseringsskjema for // localhost: 8082 [main] DEBUG ... - Utfører forespørsel 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 ... >> Vert: localhost: 8082 [main] DEBUG ... >> Autorisasjon: Grunnleggende dXNlcjE6dXNlcjFQYXNz [main] DEBUG ... << HTTP / 1.1 200 OK [main] DEBUG ... - Autentisering lykkes

Alt ser bra ut:

  • ordningen "Grunnleggende godkjenning" er forhåndsvalgt
  • forespørselen sendes med Autorisasjon Overskrift
  • serveren svarer med en 200 OK
  • Autentisering lykkes

4. Grunnleggende godkjenning med rå HTTP-overskrifter

Forebyggende grunnleggende autentisering betyr i utgangspunktet forhåndssending av Autorisasjon Overskrift.

Så i stedet for å gå gjennom det ganske komplekse forrige eksemplet for å sette det opp, vi kan ta kontroll over denne overskriften og konstruere den for hånd:

HttpGet forespørsel = 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 = "Basic" + new String (encodedAuth); request.setHeader (HttpHeaders.AUTHORIZATION, authHeader); HttpClient-klient = HttpClientBuilder.create (). Build (); HttpResponse respons = client.execute (forespørsel); int statusCode = respons.getStatusLine (). getStatusCode (); assertThat (statusCode, equalTo (HttpStatus.SC_OK));

La oss sørge for at dette fungerer riktig:

[main] DEBUG ... - Auth cache not set in the context [main] DEBUG ... - Åpne tilkobling {} -> // localhost: 8080 [main] DEBUG ... - Koble til localhost / 127.0.0.1: 8080 [main] DEBUG ... - Utfører forespørsel GET / spring-security-rest-basic-auth / api / foos / 1 HTTP / 1.1 [main] DEBUG ... - Proxy auth state: UNCHALLENGED [main] DEBUG .. . - http-utgående-0 >> GET / vår-sikkerhet-hvile-basic-auth / api / foos / 1 HTTP / 1.1 [hoved] DEBUG ... - http-utgående-0 >> Autorisasjon: Grunnleggende dXNlcjE6dXNlcjFQYXNz [hoved ] DEBUG ... - http-utgående-0 << HTTP / 1.1 200 OK

Så selv om det ikke er noen autentisk hurtigbuffer, Grunnleggende godkjenning fungerer fortsatt riktig, og vi mottar 200 OK.

5. Konklusjon

Denne artikkelen illustrerte forskjellige måter å sette opp og bruke grunnleggende autentisering med Apache HttpClient 4.

Som alltid er koden presentert i denne artikkelen tilgjengelig på Github. Dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


$config[zx-auto] not found$config[zx-overlay] not found