Otentikasi dengan HttpUrlConnection

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

Dalam tutorial ini, kita akan mempelajari cara mengautentikasi permintaan HTTP menggunakan kelas HttpUrlConnection .

2. Otentikasi HTTP

Dalam aplikasi web, server mungkin memerlukan klien untuk mengotentikasi dirinya sendiri. Gagal mematuhi biasanya mengakibatkan server mengembalikan kode status HTTP 401 (Tidak Sah).

Ada beberapa skema otentikasi yang berbeda dalam kekuatan keamanan yang mereka berikan. Namun, upaya implementasinya juga bervariasi.

Mari kita lihat tiga di antaranya:

  • basic adalah skema yang akan kita bahas lebih lanjut di bagian selanjutnya
  • digest menerapkan algoritma hash pada kredensial pengguna dan nonce yang ditentukan server
  • pembawa menggunakan token akses sebagai bagian dari OAuth 2.0

3. Otentikasi Dasar

Otentikasi dasar memungkinkan klien untuk mengotentikasi diri mereka sendiri menggunakan nama pengguna dan kata sandi yang dikodekan melalui header Otorisasi :

GET / HTTP/1.1 Authorization: Basic dXNlcjpwYXNzd29yZA==

Untuk membuat nama pengguna dan string kata sandi yang dikodekan, kami cukup menyandikan nama pengguna Base64, diikuti oleh titik dua, diikuti dengan kata sandi:

basic(user, pass) = base64-encode(user + ":" + pass)

Ingat beberapa peringatan dari RFC 7617, meskipun:

Skema ini tidak dianggap sebagai metode otentikasi pengguna yang aman kecuali digunakan bersama dengan beberapa sistem aman eksternal seperti TLS

Ini, tentu saja, karena nama pengguna dan kata sandi berjalan sebagai teks biasa melalui jaringan dalam setiap permintaan.

4. Otentikasi Koneksi

Oke, dengan itu sebagai latar belakang, mari kita mulai mengkonfigurasi HttpUrlConnection untuk menggunakan HTTP Basic.

Kelas HttpUrlConnection dapat mengirim permintaan, tetapi pertama-tama, kita harus mendapatkan turunannya dari objek URL:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

Sebuah koneksi menawarkan banyak metode untuk mengkonfigurasinya, seperti setRequestMethod dan setRequestProperty.

Aneh karena setRequestProperty suara, ini adalah yang kita inginkan.

Setelah kita menggabungkan nama pengguna dan kata sandi menggunakan ":", kita dapat menggunakan kelas java.util.Base64 untuk menyandikan kredensial:

String auth = user + ":" + password; byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));

Kemudian, kami membuat nilai header dari "Dasar" literal diikuti dengan kredensial yang dikodekan:

String authHeaderValue = "Basic " + new String(encodedAuth);

Selanjutnya, kita memanggil metode setRequestProperty (key, value) untuk mengautentikasi permintaan. Seperti disebutkan sebelumnya, kita harus menggunakan "Otorisasi" sebagai header dan "Dasar" + kredensial yang dikodekan sebagai nilai kita:

connection.setRequestProperty("Authorization", authHeaderValue);

Terakhir, kita perlu mengirim permintaan HTTP, seperti misalnya dengan memanggil getResponseCode () . Hasilnya, kami mendapatkan kode respons HTTP dari server:

int responseCode = connection.getResponseCode();

Apa pun yang ada di keluarga 2xx berarti permintaan kami termasuk bagian autentikasi baik-baik saja!

5. Otentikator Java

Penerapan autentikasi dasar yang disebutkan di atas memerlukan pengaturan header otorisasi untuk setiap permintaan. Sebaliknya, kelas abstrak java.net.Authenticator memungkinkan pengaturan otentikasi secara global untuk semua koneksi .

Kita perlu memperluas kelasnya dulu. Kemudian, kami memanggil metode statis Authenticator.setDefault () untuk mendaftarkan instance dari pengautentikasi kami:

Authenticator.setDefault(new BasicAuthenticator());

Kelas autentikasi dasar kami baru saja mengganti metode non-abstrak getPasswordAuthentication () dari kelas dasar:

private final class BasicAuthenticator extends Authenticator { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user, password.toCharArray()); } }

Kelas Authenticator menggunakan kredensial pengautentikasi kami untuk memenuhi skema otentikasi yang diperlukan oleh server secara otomatis.

6. Kesimpulan

Dalam tutorial singkat ini, kita telah melihat bagaimana menerapkan otentikasi dasar ke permintaan yang dikirim melalui HttpUrlConnection .

Seperti biasa, contoh kode dapat ditemukan di GitHub.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya