Provjera autentičnosti pomoću HttpUrlConnection

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

U ovom uputstvu istražit ćemo kako provjeriti autentičnost HTTP zahtjeva pomoću HttpUrlConnection razred.

2. HTTP autentifikacija

U web aplikacijama poslužitelji mogu zahtijevati od klijenata da se provjere autentičnost. Nepridržavanje obično rezultira vraćanjem HTTP 401 (neovlaštenog) statusnog koda.

Postoji više shema provjere autentičnosti koje se razlikuju po sigurnosnoj snazi ​​koju pružaju. Međutim, i napor oko provedbe varira.

Pogledajmo tri od njih:

  • Osnovni, temeljni shema je o kojoj ćemo više reći u sljedećem odjeljku
  • probaviti primjenjuje hash algoritme na vjerodajnice korisnika i nonce koji određuje poslužitelj
  • donositelj koristi pristupne tokene kao dio OAuth 2.0

3. Osnovna autentifikacija

Osnovna autentifikacija omogućuje klijentima da se autentificiraju pomoću kodirano korisničko ime i lozinka putem Ovlaštenje Zaglavlje:

GET / HTTP / 1.1 Odobrenje: Osnovni dXNlcjpwYXNzd29yZA ==

Da bismo stvorili kodirano korisničko ime i niz lozinke, jednostavno Base64 kodiramo korisničko ime, nakon čega slijedi dvotočka, a zatim lozinka:

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

Ipak, upamtite određeni oprez iz RFC 7617:

Ova se shema ne smatra sigurnom metodom autentifikacije korisnika, osim ako se koristi zajedno s nekim vanjskim sigurnim sustavom kao što je TLS

To je naravno, jer korisničko ime i lozinka putuju kao običan tekst mrežom unutar svakog zahtjeva.

4. Provjerite autentičnost veze

Ok, s tim kao pozadinom, krenimo u konfiguriranje HttpUrlConnection koristiti HTTP Basic.

Razred HttpUrlConnection može slati zahtjeve, ali prvo ga moramo dobiti od objekta URL-a:

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

Veza nudi mnogo metoda za njezino konfiguriranje, poput setRequestMethod i setRequestProperty.

Čudno kao setRequestProperty zvuči, ovo je ono što želimo.

Nakon što se pridružimo korisničkom imenu i lozinci pomoću ":", možemo koristiti java.util.Base64 klasa za kodiranje vjerodajnica:

Niz auth = user + ":" + lozinka; bajt [] encodedAuth = Base64.encodeBase64 (auth.getBytes (StandardCharsets.UTF_8));

Zatim kreiramo vrijednost zaglavlja od doslovnog "Basic", a zatim kodiranih vjerodajnica:

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

Dalje, nazivamo metodu setRequestProperty (ključ, vrijednost) za ovjeru zahtjeva. Kao što je prethodno spomenuto, moramo koristiti “Odobrenje” kao naše zaglavlje i Vjerodajnice "Basic" + kodirane kao naša vrijednost:

connection.setRequestProperty ("Autorizacija", authHeaderValue);

Napokon, trebamo zapravo poslati HTTP zahtjev, kao na primjer pozivanjem getResponseCode (). Kao rezultat, s poslužitelja dobivamo kôd HTTP odgovora:

int responseCode = connection.getResponseCode ();

Sve u obitelji 2xx znači da je naš zahtjev, uključujući dio za provjeru autentičnosti, bio u redu!

5. Java Autentifikator

Gore navedena osnovna provedba autorizacije zahtijeva postavljanje zaglavlja autorizacije za svaki zahtjev. Suprotno tome, apstraktna klasa java.net.Authenticator dopušta globalno postavljanje provjere autentičnosti za sve veze.

Prvo moramo produžiti razred. Tada nazivamo statičku metodu Autentifikator.setDefault () kako bismo registrirali primjerak našeg autentifikatora:

Authenticator.setDefault (novi BasicAuthenticator ());

Naša osnovna autentična klasa upravo nadjačava getPasswordAuthentication () ne-apstraktna metoda osnovne klase:

privatna završna klasa BasicAuthenticator proširuje Autentifikator {zaštićen PasswordAuthentication getPasswordAuthentication () {vraća novu PasswordAuthentication (korisnik, password.toCharArray ()); }}

Klasa Autentifikator koristi vjerodajnice našeg autentifikatora kako bi automatski ispunila shemu autentifikacije koju zahtijeva poslužitelj.

6. Zaključak

U ovom kratkom vodiču vidjeli smo kako primijeniti osnovnu provjeru autentičnosti na zahtjeve poslane putem HttpUrlConnection.

Kao i uvijek, primjer koda možete pronaći na GitHubu.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ