HttpUrlConnectionによる認証
1. 概要
このチュートリアルでは、HttpUrlConnectionクラスを使用してHTTPリクエストを認証する方法について説明します。
2. HTTP認証
Webアプリケーションでは、サーバーはクライアントに自身の認証を要求する場合があります。 通常、準拠しないと、サーバーはHTTP 401(未承認)ステータスコードを返します。
提供するセキュリティ強度が異なる複数の認証スキームがあります。 ただし、実装作業も異なります。
それらのうちの3つを見てみましょう:
- 基本は、次のセクションで詳しく説明するスキームです。
- digest は、ユーザー資格情報とサーバー指定のナンスにハッシュアルゴリズムを適用します
- ベアラーは、 OAuth2.0の一部としてアクセストークンを利用します
3. 基本認証
基本認証により、クライアントはエンコードされたユーザー名とパスワードを使用してAuthorizationヘッダーを介して自分自身を認証できます。
GET / HTTP/1.1
Authorization: Basic dXNlcjpwYXNzd29yZA==
エンコードされたユーザー名とパスワード文字列を作成するには、単純にBase64でエンコードします。ユーザー名、コロン、パスワードの順にエンコードします。
basic(user, pass) = base64-encode(user + ":" + pass)
ただし、 RFC7617からの注意を覚えておいてください。
このスキームは、TLSなどの外部の安全なシステムと組み合わせて使用しない限り、ユーザー認証の安全な方法とは見なされません。
もちろん、これは、ユーザー名とパスワードが各リクエスト内でネットワーク上をプレーンテキストとして移動するためです。
4. 接続を認証する
さて、それを背景として、HTTPBasicを使用するようにHttpUrlConnectionを構成することに取り掛かりましょう。
クラスHttpUrlConnectionはリクエストを送信できますが、最初に、URLオブジェクトからそのインスタンスを取得する必要があります。
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
接続には、次のような構成方法が多数用意されています。 setRequestMethod と
setRequestProperty のように聞こえますが、これが必要なものです。
「:」を使用してユーザー名とパスワードを結合すると、 java.util.Base64クラスを使用して資格情報をエンコードできます。
String auth = user + ":" + password;
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));
次に、文字通りの「Basic」とそれに続くエンコードされた資格情報からヘッダー値を作成します。
String authHeaderValue = "Basic " + new String(encodedAuth);
次に、メソッド setRequestProperty(key、value)を呼び出して、リクエストを認証します。 前述のように、ヘッダーとして「承認」を使用し、値として「基本」+エンコードされたクレデンシャルを使用する必要があります:
connection.setRequestProperty("Authorization", authHeaderValue);
最後に、たとえば getResponseCode()を呼び出すなどして、実際にHTTPリクエストを送信する必要があります。 その結果、サーバーからHTTP応答コードを取得します。
int responseCode = connection.getResponseCode();
2xxファミリのいずれかは、認証部分を含むリクエストが正常であったことを意味します。
5. Javaオーセンティケーター
上記の基本認証の実装では、すべての要求に対して認証ヘッダーを設定する必要があります。 対照的に、抽象クラス java.net.Authenticator では、すべての接続の認証をグローバルに設定できます。
最初にクラスを拡張する必要があります。 次に、静的メソッド Authenticator.setDefault()を呼び出して、オーセンティケーターのインスタンスを登録します。
Authenticator.setDefault(new BasicAuthenticator());
基本認証クラスは、基本クラスの getPasswordAuthentication()非抽象メソッドをオーバーライドするだけです。
private final class BasicAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}
オーセンティケータークラスは、オーセンティケーターのクレデンシャルを利用して、サーバーに必要な認証スキームを自動的に実行します。
6. 結論
この短いチュートリアルでは、HttpUrlConnectionを介して送信された要求に基本認証を適用する方法を説明しました。
いつものように、コード例はGitHubのにあります。