Pengesahan dengan HttpUrlConnection

Java Teratas

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

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan meneroka cara mengesahkan permintaan HTTP menggunakan kelas HttpUrlConnection .

2. Pengesahan HTTP

Dalam aplikasi web, pelayan mungkin memerlukan pelanggan mengesahkan diri mereka sendiri. Kegagalan mematuhi biasanya menyebabkan pelayan mengembalikan kod status HTTP 401 (Tidak Dibenar).

Terdapat beberapa skema pengesahan yang berbeza dalam kekuatan keselamatan yang mereka berikan. Namun, usaha pelaksanaannya juga berbeza.

Mari lihat tiga daripadanya:

  • asas adalah skema yang akan kita katakan lebih banyak mengenai bahagian seterusnya
  • digest menerapkan algoritma hash pada kelayakan pengguna dan bukan yang ditentukan oleh pelayan
  • pembawa menggunakan token akses sebagai sebahagian daripada OAuth 2.0

3. Pengesahan Asas

Pengesahan asas membolehkan pelanggan mengesahkan diri menggunakan nama pengguna dan kata laluan yang dikodkan melalui tajuk Pengesahan :

GET / HTTP/1.1 Authorization: Basic dXNlcjpwYXNzd29yZA==

Untuk membuat nama pengguna dan rentetan kata laluan yang dikodkan, kami hanya mengekodkan nama pengguna Base64, diikuti oleh titik dua, diikuti dengan kata laluan:

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

Ingatlah dengan berhati-hati dari RFC 7617, walaupun:

Skema ini tidak dianggap sebagai kaedah pengesahan pengguna yang selamat melainkan digunakan bersama dengan beberapa sistem selamat luaran seperti TLS

Ini tentu saja, kerana nama pengguna dan kata laluan bergerak sebagai teks biasa melalui rangkaian dalam setiap permintaan.

4. Mengesahkan Sambungan

Baiklah, dengan latar belakang, mari kita konfigurasikan HttpUrlConnection untuk menggunakan HTTP Basic.

Kelas HttpUrlConnection dapat menghantar permintaan, tetapi pertama, kita harus mendapatkannya dari objek URL:

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

Sambungan menawarkan banyak kaedah untuk mengkonfigurasinya, seperti setRequestMethod dan setRequestProperty.

Seperti yang ganjil seperti bunyi setRequestProperty , inilah yang kita mahukan.

Setelah bergabung dengan nama pengguna dan kata laluan menggunakan ":", kita dapat menggunakan kelas java.util.Base64 untuk mengekod kelayakan:

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

Kemudian, kami membuat nilai header dari "Basic" harfiah diikuti dengan kelayakan yang dikodkan:

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

Seterusnya, kami memanggil kaedah setRequestProperty (kunci, nilai) untuk mengesahkan permintaan. Seperti yang telah disebutkan sebelumnya, kita harus menggunakan "Pengesahan" sebagai tajuk kami dan bukti kelayakan yang dikodkan "Asas" + sebagai nilai kami:

connection.setRequestProperty("Authorization", authHeaderValue);

Akhirnya, kita perlu benar-benar mengirim permintaan HTTP, seperti misalnya dengan memanggil getResponseCode () . Hasilnya, kami mendapat kod respons HTTP dari pelayan:

int responseCode = connection.getResponseCode();

Apa-apa sahaja dalam keluarga 2xx bermaksud bahawa permintaan kami termasuk bahagian pengesahan tidak mengapa!

5. Pengesah Java

Pelaksanaan autentikasi asas yang disebutkan di atas memerlukan menetapkan tajuk otorisasi untuk setiap permintaan. Sebaliknya, kelas abstrak java.net.Authenticator membolehkan menetapkan pengesahan secara global untuk semua sambungan .

Kita perlu melanjutkan kelas terlebih dahulu. Kemudian, kami memanggil kaedah statik Authenticator.setDefault () untuk mendaftarkan contoh pengesah kami:

Authenticator.setDefault(new BasicAuthenticator());

Kelas autentik asas kami hanya menggantikan kaedah getPasswordAuthentication () bukan abstrak dari kelas asas:

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

Kelas Authenticator menggunakan kelayakan pengesah kami untuk memenuhi skema pengesahan yang diperlukan oleh pelayan secara automatik.

6. Kesimpulannya

Dalam tutorial ringkas ini, kami telah melihat bagaimana menerapkan pengesahan asas untuk permintaan yang dihantar melalui HttpUrlConnection .

Seperti biasa, contoh kod boleh didapati di GitHub.

Bahagian bawah Java

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

>> SEMAK KURSUS