Otentikasi Dasar dengan RestTemplate

Daftar Isi

  • 1. Ikhtisar
  • 2. Menyiapkan RestTemplate di Spring
  • 3. Manajemen manual dari header HTTP Otorisasi
  • 4. Manajemen otomatis header HTTP Otorisasi
  • 5. Dependensi Maven
  • 6. Kesimpulan

1. Ikhtisar

Artikel ini menunjukkan cara menggunakan Springs RestTemplate untuk menggunakan Layanan RESTful yang diamankan dengan Autentikasi Dasar .

Setelah Otentikasi Dasar disiapkan untuk templat, setiap permintaan akan dikirim terlebih dahulu yang berisi kredensial lengkap yang diperlukan untuk melakukan proses otentikasi. Kredensial akan dikodekan dan akan menggunakan Header HTTP Otorisasi , sesuai dengan spesifikasi skema Otentikasi Dasar. Contohnya akan terlihat seperti ini:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

2. Menyiapkan RestTemplate

Bootstrap RestTemplate ke dalam konteks Spring dapat dilakukan hanya dengan mendeklarasikan bean untuk itu; namun, menyiapkan RestTemplate dengan Otentikasi Dasar akan memerlukan intervensi manual, jadi alih-alih mendeklarasikan bean secara langsung, Spring FactoryBean akan digunakan untuk fleksibilitas lebih. Pabrik ini akan membuat dan mengkonfigurasi template saat inisialisasi:

@Component public class RestTemplateFactory implements FactoryBean, InitializingBean { private RestTemplate restTemplate; public RestTemplate getObject() { return restTemplate; } public Class getObjectType() { return RestTemplate.class; } public boolean isSingleton() { return true; } public void afterPropertiesSet() { HttpHost host = new HttpHost("localhost", 8082, "http"); restTemplate = new RestTemplate( new HttpComponentsClientHttpRequestFactoryBasicAuth(host)); } }

Nilai host dan port harus bergantung pada lingkungan - memungkinkan klien fleksibilitas untuk menentukan satu set nilai untuk pengujian integrasi dan lainnya untuk penggunaan produksi. Nilai dapat dikelola dengan dukungan Spring kelas pertama untuk file properti.

3. Manajemen Manual Header HTTP Otorisasi

Proses pembuatan header Otorisasi relatif mudah untuk Otentikasi Dasar, sehingga dapat dilakukan secara manual dengan beberapa baris kode:

HttpHeaders createHeaders(String username, String password){ return new HttpHeaders() {{ String auth = username + ":" + password; byte[] encodedAuth = Base64.encodeBase64( auth.getBytes(Charset.forName("US-ASCII")) ); String authHeader = "Basic " + new String( encodedAuth ); set( "Authorization", authHeader ); }}; }

Kemudian, mengirim permintaan menjadi sesederhana itu:

restTemplate.exchange (uri, HttpMethod.POST, new HttpEntity(createHeaders(username, password)), clazz);

4. Manajemen Otomatis Header HTTP Otorisasi

Baik Spring 3.0 dan 3.1 dan sekarang 4.x memiliki dukungan yang sangat baik untuk pustaka HTTP Apache:

  • Musim semi 3.0, CommonsClientHttpRequestFactory terintegrasi dengan HttpClient 3.x yang sekarang sudah habis masa pakainya
  • Spring 3.1 memperkenalkan dukungan untuk HttpClient 4.x saat ini melalui HttpComponentsClientHttpRequestFactory (dukungan ditambahkan di JIRA SPR-6180)
  • Spring 4.0 memperkenalkan dukungan asinkron melalui HttpComponentsAsyncClientHttpRequestFactory

Mari mulai mengatur segalanya dengan HttpClient 4 dan Spring 4.

The RestTemplate akan memerlukan permintaan HTTP pabrik - pabrik yang mendukung otentikasi dasar - sejauh ini, begitu baik. Namun, menggunakan HttpComponentsClientHttpRequestFactory yang sudah ada secara langsung akan terbukti sulit, karena arsitektur RestTemplate dirancang tanpa dukungan yang baik untuk HttpContext - bagian penting dari teka-teki. Jadi kita perlu membuat subkelas HttpComponentsClientHttpRequestFactory dan mengganti metode createHttpContext :

public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory { HttpHost host; public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) { super(); this.host = host; } protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) { return createHttpContext(); } private HttpContext createHttpContext() { AuthCache authCache = new BasicAuthCache(); BasicScheme basicAuth = new BasicScheme(); authCache.put(host, basicAuth); BasicHttpContext localcontext = new BasicHttpContext(); localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache); return localcontext; } }

Di sinilah - dalam pembuatan HttpContext - dukungan otentikasi dasar dibangun. Seperti yang Anda lihat, melakukan Autentikasi Dasar preemptive dengan HttpClient 4.x adalah sedikit beban: info otentikasi di-cache dan proses pengaturan cache otentikasi ini sangat manual dan tidak intuitif.

Dan dengan itu, semuanya sudah siap - RestTemplate sekarang akan dapat mendukung skema Otentikasi Dasar hanya dengan menambahkan BasicAuthorizationInterceptor ;

restTemplate.getInterceptors().add( new BasicAuthorizationInterceptor("username", "password"));

Dan permintaannya:

restTemplate.exchange( "//localhost:8082/spring-security-rest-basic-auth/api/foos/1", HttpMethod.GET, null, Foo.class);

Untuk diskusi mendalam tentang cara mengamankan Layanan REST itu sendiri, lihat artikel ini.

5. Ketergantungan Maven

Dependensi Maven berikut diperlukan untuk RestTemplate itu sendiri dan untuk perpustakaan HttpClient:

 org.springframework spring-webmvc 5.0.6.RELEASE   org.apache.httpcomponents httpclient 4.5.3 

Secara opsional, jika header HTTP Authorization dibuat secara manual, pustaka tambahan diperlukan untuk dukungan encoding:

 commons-codec commons-codec 1.10 

Anda akan menemukan versi terbaru di repositori Maven.

6. Kesimpulan

Meskipun pengembangan 3.x cabang untuk Apache HttpClient telah mencapai akhir masa pakainya untuk sementara waktu sekarang, dan dukungan Spring untuk versi itu telah sepenuhnya ditinggalkan, banyak informasi yang dapat ditemukan di RestTemplate dan keamanan masih tidak akun untuk rilis HttpClient 4.x saat ini. Artikel ini adalah upaya untuk mengubahnya melalui pembahasan langkah demi langkah yang mendetail tentang cara menyiapkan Autentikasi Dasar dengan RestTemplate dan cara menggunakannya untuk menggunakan REST API yang aman.

Untuk melampaui contoh kode dalam artikel dengan implementasi dari kedua sisi konsumsi, yang diperiksa di sini, tetapi juga RESTful Service yang sebenarnya, lihat proyek di Github.

Ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankan apa adanya.