1. 概要

この短いチュートリアルでは、基本認証について見ていきます。 それがどのように機能するかを確認し、この種の認証を使用するように JavaHttpClientを構成します。

2. 基本認証

基本認証は単純な認証方法です。 クライアントは、ユーザー名とパスワードを使用して認証できます。 これらのクレデンシャルは、 承認特定の形式のHTTPヘッダー。 Basic キーワードで始まり、base64でエンコードされた username:passwordの値が続きます。 ここではコロン文字が重要です。 ヘッダーは厳密にこの形式に従う必要があります。

たとえば、baeldungユーザー名とHttpClientパスワードで認証するには、次のヘッダーを送信する必要があります。

Basic YmFlbGR1bmc6SHR0cENsaWVudA==

base64デコーダーを使用し、デコードされた結果を確認することで確認できます。

3. JavaHttpClient

Java 9は、Java11で標準化されたインキュベーションモジュールとして新しいHttpClientを導入しました。Java 11を使用するため、java.net.httpパッケージから簡単にインポートできます。追加の構成や依存関係はありません。

今のところ、認証なしで単純なGETリクエストを実行することから始めましょう。

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
  .GET()
  .uri(new URI("https://postman-echo.com/get"))
  .build();

HttpResponse<String> response = client.send(request, BodyHandlers.ofString());

logger.info("Status {}", response.statusCode());

まず、HTTPリクエストの実行に使用できるHttpClientを作成します。 次に、ビルダーデザインパターンを使用してHttpRequestを作成します。 GETメソッドは、リクエストのHTTPメソッドを設定します。 uriメソッドは、リクエストを送信するURLを設定します。

その後、クライアントを使用してリクエストを送信します。 send メソッドの2番目のパラメーターは、応答ボディハンドラーです。 これは、応答本文をStringとして扱いたいことをクライアントに通知します。

アプリケーションを実行して、ログを確認しましょう。 出力は次のようになります。

INFO com.baeldung.httpclient.basicauthentication.HttpClientBasicAuthentication - Status 200

HTTPステータスが200であることがわかります。これは、リクエストが成功したことを意味します。その後、認証を処理する方法を見てみましょう。

4. HttpClientオーセンティケーターの使用

認証を構成する前に、それをテストするためのURLが必要です。 認証が必要なPostmanEchoエンドポイントを使用してみましょう。 まず、前のURLをこれに変更して、アプリケーションを再実行します。

HttpRequest request = HttpRequest.newBuilder()
  .GET()
  .uri(new URI("https://postman-echo.com/basic-auth"))
  .build();

ログを確認して、ステータスコードを探しましょう。 今回は、HTTPステータス401「Unauthorized」を受け取りました。 この応答コードは、エンドポイントに認証が必要であるが、クライアントが資格情報を送信しなかったことを意味します。

必要な認証データを送信するようにクライアントを変更してみましょう。 HttpClient Builderを構成することでこれを行うことができ、クライアントは設定した資格情報を使用します。このエンドポイントは、ユーザー名「postman」とパスワード「password」[ X199X]。 オーセンティケーターをクライアントに追加しましょう。

HttpClient client = HttpClient.newBuilder()
  .authenticator(new Authenticator() {
      @Override
      protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication("postman", "password".toCharArray());
      }
  })
  .build();

アプリケーションをもう一度実行してみましょう。 これでリクエストは成功し、HTTPステータス200を受け取ります。

5. HTTPヘッダーを使用して認証する

別のアプローチを使用して、認証を必要とするエンドポイントにアクセスできます。 前のセクションから、Authorizationヘッダーの作成方法を学習したので、その値を手動で設定できます。 ただし、これは、オーセンティケーターを介して一度設定するのではなく、リクエストごとに実行する必要があります。

オーセンティケーターを削除して、リクエストヘッダーを設定する方法を見てみましょう。 base64エンコーディングを使用してヘッダー値を作成する必要があります。

private static final String getBasicAuthenticationHeader(String username, String password) {
    String valueToEncode = username + ":" + password;
    return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes());
}

Authorization ヘッダーにこの値を設定して、アプリケーションを実行してみましょう。

HttpRequest request = HttpRequest.newBuilder()
  .GET()
  .uri(new URI("https://postman-echo.com/basic-auth"))
  .header("Authorization", getBasicAuthenticationHeader("postman", "password"))
  .build();

リクエストは成功しました。これは、ヘッダー値を正しく作成して設定したことを意味します。

6. 結論

この短いチュートリアルでは、基本認証とは何か、そしてそれがどのように機能するかを見ました。 Java HttpClient を、 authenticationator を設定することにより、基本認証で使用しました。 HTTPヘッダーを手動で設定することにより、認証に別のアプローチを使用しました。

いつものように、これらの例のソースコードは、GitHubから入手できます。