Pengesahan Asas HttpClient

1. Gambaran keseluruhan

Tutorial ini akan menggambarkan cara mengkonfigurasi Pengesahan Asas pada Apache HttpClient 4 .

Sekiranya anda ingin menggali lebih mendalam dan mengetahui perkara menarik lain yang boleh anda lakukan dengan HttpClient - teruskan ke tutorial HttpClient utama .

2. Pengesahan Asas Dengan API

Mari kita mulakan dengan cara standard untuk mengkonfigurasi Pengesahan Asas pada HttpClient - melalui CredentialsProvider :

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

Seperti yang kita lihat, membuat pelanggan dengan pembekal kelayakan untuk menetapkannya dengan Pengesahan Asas tidaklah sukar.

Sekarang, untuk memahami apa yang sebenarnya akan dilakukan oleh HttpClient di belakang tabir, kita perlu melihat log:

# ... request is sent with no credentials [main] DEBUG ... - Authentication required [main] DEBUG ... - localhost:8080 requested authentication [main] DEBUG ... - Authentication schemes in the order of preference: [negotiate, Kerberos, NTLM, Digest, Basic] [main] DEBUG ... - Challenge for negotiate authentication scheme not available [main] DEBUG ... - Challenge for Kerberos authentication scheme not available [main] DEBUG ... - Challenge for NTLM authentication scheme not available [main] DEBUG ... - Challenge for Digest authentication scheme not available [main] DEBUG ... - Selected authentication options: [BASIC] # ... the request is sent again - with credentials

Keseluruhan komunikasi Pelanggan-Pelayan kini jelas :

  • Pelanggan menghantar Permintaan HTTP tanpa bukti kelayakan
  • Pelayan menghantar kembali cabaran
  • Pelanggan berunding dan mengenal pasti skema pengesahan yang betul
  • Pelanggan menghantar Permintaan kedua , kali ini dengan bukti kelayakan

3. Pengesahan Asas Preemptive

Di luar kotak, HttpClient tidak melakukan pengesahan awal. Sebaliknya, ini mestilah keputusan eksplisit yang dibuat oleh pelanggan.

Pertama, kita perlu membuat HttpContext - pra- mengisi dengan cache pengesahan dengan jenis skema pengesahan yang betul dipilih sebelumnya. Ini bermaksud bahawa perundingan dari contoh sebelumnya tidak lagi diperlukan - Pengesahan Asas sudah dipilih :

HttpHost targetHost = new HttpHost("localhost", 8082, "http"); CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS)); AuthCache authCache = new BasicAuthCache(); authCache.put(targetHost, new BasicScheme()); // Add AuthCache to the execution context HttpClientContext context = HttpClientContext.create(); context.setCredentialsProvider(credsProvider); context.setAuthCache(authCache);

Sekarang kita dapat menggunakan klien dengan konteks baru dan mengirim permintaan pra-pengesahan :

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));

Mari lihat log:

[main] DEBUG ... - Re-using cached 'basic' auth scheme for //localhost:8082 [main] DEBUG ... - Executing request 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 ... >> Authorization: Basic dXNlcjE6dXNlcjFQYXNz [main] DEBUG ... << HTTP/1.1 200 OK [main] DEBUG ... - Authentication succeeded

Semuanya kelihatan OK:

  • skema "Pengesahan Asas" telah dipilih sebelumnya
  • Permintaan dihantar dengan tajuk Pengesahan
  • Pelayan bertindak balas dengan 200 OK
  • Pengesahan berjaya

4. Pengesahan Asas Dengan Header HTTP Mentah

Pengesahan Asas Preemptive pada dasarnya bermaksud pra-menghantar tajuk Pengesahan .

Oleh itu, daripada melalui contoh sebelumnya yang agak rumit untuk menyiapkannya, kita dapat mengawal tajuk ini dan membinanya dengan tangan :

HttpGet request = new 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 client = HttpClientBuilder.create().build(); HttpResponse response = client.execute(request); int statusCode = response.getStatusLine().getStatusCode(); assertThat(statusCode, equalTo(HttpStatus.SC_OK));

Mari pastikan ini berfungsi dengan betul:

[main] DEBUG ... - Auth cache not set in the context [main] DEBUG ... - Opening connection {}->//localhost:8080 [main] DEBUG ... - Connecting to localhost/127.0.0.1:8080 [main] DEBUG ... - Executing request GET /spring-security-rest-basic-auth/api/foos/1 HTTP/1.1 [main] DEBUG ... - Proxy auth state: UNCHALLENGED [main] DEBUG ... - http-outgoing-0 >> GET /spring-security-rest-basic-auth/api/foos/1 HTTP/1.1 [main] DEBUG ... - http-outgoing-0 >> Authorization: Basic dXNlcjE6dXNlcjFQYXNz [main] DEBUG ... - http-outgoing-0 << HTTP/1.1 200 OK

Jadi, walaupun tidak ada cache autentikasi , Pengesahan Asas masih berfungsi dengan betul dan kami menerima 200 OK.

5. Kesimpulan

Artikel ini menggambarkan pelbagai cara untuk mengatur dan menggunakan pengesahan asas dengan Apache HttpClient 4.

Seperti biasa, kod yang disajikan dalam artikel ini terdapat di Github. Ini adalah projek berasaskan Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.