Authentifizierung mit HttpUrlConnection

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

In diesem Tutorial erfahren Sie , wie Sie HTTP-Anforderungen mithilfe der HttpUrlConnection- Klasse authentifizieren .

2. HTTP-Authentifizierung

In Webanwendungen müssen Server von Clients möglicherweise verlangen, dass sie sich authentifizieren. Bei Nichtbeachtung gibt der Server normalerweise einen HTTP 401-Statuscode (Unauthorized) zurück.

Es gibt mehrere Authentifizierungsschemata, die sich in der von ihnen bereitgestellten Sicherheitsstärke unterscheiden. Der Implementierungsaufwand ist jedoch ebenfalls unterschiedlich.

Sehen wir uns drei davon an:

  • basic ist ein Schema, über das wir im nächsten Abschnitt mehr sagen werden
  • Digest wendet Hash-Algorithmen auf Benutzeranmeldeinformationen und eine vom Server angegebene Nonce an
  • Inhaber verwendet Zugriffstoken als Teil von OAuth 2.0

3. Grundlegende Authentifizierung

Mit der Standardauthentifizierung können sich Clients mithilfe eines verschlüsselten Benutzernamens und Kennworts über den Autorisierungsheader authentifizieren :

GET / HTTP/1.1 Authorization: Basic dXNlcjpwYXNzd29yZA==

Um den codierten Benutzernamen und die Kennwortzeichenfolge zu erstellen, codieren wir einfach den Benutzernamen mit Base64, gefolgt von einem Doppelpunkt und dem Kennwort:

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

Beachten Sie jedoch die Vorsicht von RFC 7617:

Dieses Schema wird nicht als sichere Methode zur Benutzerauthentifizierung angesehen, es sei denn, es wird in Verbindung mit einem externen sicheren System wie TLS verwendet

Dies liegt natürlich daran, dass der Benutzername und das Kennwort innerhalb jeder Anforderung als Klartext über das Netzwerk übertragen werden.

4. Authentifizieren Sie eine Verbindung

Okay, mit diesem Hintergrund wollen wir HttpUrlConnection für die Verwendung von HTTP Basic konfigurieren .

Die Klasse HttpUrlConnection kann Anforderungen senden, aber zuerst müssen wir eine Instanz davon von einem URL-Objekt abrufen :

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

Eine Verbindung bietet viele Methoden zum Konfigurieren, z. B. setRequestMethod und setRequestProperty.

So seltsam setRequestProperty auch klingt, dies ist das, was wir wollen.

Sobald wir den Benutzernamen und das Kennwort mit ":" verknüpft haben, können wir die Anmeldeinformationen mit der Klasse " java.util.Base64" codieren:

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

Anschließend erstellen wir den Header-Wert aus dem Literal "Basic", gefolgt von den codierten Anmeldeinformationen:

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

Als Nächstes rufen wir die Methode setRequestProperty (Schlüssel, Wert) auf, um die Anforderung zu authentifizieren. Wie bereits erwähnt, müssen wir "Authorization" als Header und "Basic" + codierte Anmeldeinformationen als Wert verwenden:

connection.setRequestProperty("Authorization", authHeaderValue);

Schließlich müssen wir die HTTP-Anfrage tatsächlich senden, beispielsweise durch Aufrufen von getResponseCode () . Als Ergebnis erhalten wir einen HTTP-Antwortcode vom Server:

int responseCode = connection.getResponseCode();

Alles in der 2xx-Familie bedeutet, dass unsere Anfrage einschließlich des Authentifizierungsteils in Ordnung war!

5. Java Authenticator

Für die oben erwähnte grundlegende Authentifizierungsimplementierung muss der Autorisierungsheader für jede Anforderung festgelegt werden. Im Gegensatz dazu das abstrakte Klasse java.net.Authenticator ermöglicht die Authentifizierung global für alle Verbindungen herstellen .

Wir müssen zuerst die Klasse erweitern. Dann rufen wir die statische Methode Authenticator.setDefault () auf, um eine Instanz unseres Authentifikators zu registrieren:

Authenticator.setDefault(new BasicAuthenticator());

Unsere grundlegende Auth-Klasse überschreibt nur die nicht abstrakte Methode getPasswordAuthentication () der Basisklasse:

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

Die Authenticator-Klasse verwendet die Anmeldeinformationen unseres Authentifikators, um das vom Server erforderliche Authentifizierungsschema automatisch zu erfüllen.

6. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie die Basisauthentifizierung auf Anforderungen angewendet wird , die über HttpUrlConnection gesendet werden .

Das Codebeispiel finden Sie wie immer auf GitHub.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs