[Android] HttpURLConnection:Basic認証を追加してHTTP通信する

ここでは、HttpURLConnectionを使ってBasic認証を使って通信する方法について説明します。
広 告
目次
前提条件
- 「HttpURLConnection:GETリクエストでテキストを取得する」を理解していること
動作確認端末
- Google Nexus 7 – 5.1.1 – API22(実機)
1. Basic認証設定を通信毎にする
Basic認証は、HTTPリクエストのヘッダフィールドとして追加されます。つまりURLConnection#setRequestPropery()を使ってHTTPリクエストにBasic認証用のヘッダを追加することで通信毎にBasic認証をを追加することができます。
HttpURLConnectionを使ってBasic認証を追加するコードは以下のとおりです。
Basic認証を通信毎にする
final String USERNAME = "USERNAME"; final String PASSWORD = "PASSWORD"; HttpURLConnection con = (HttpURLConnection) url.openConnection(); final String userPassword = USERNAME + ":" + PASSWORD; final String encodeAuthorization = Base64.encodeToString(userPassword.getBytes(), Base64.NO_WRAP); con.setRequestProperty("Authorization", "Basic " + encodeAuthorization); con.connect();
"Authorization"
というヘッダに、"Basic "
という文字列にBase64でエンコードされたユーザ名とパスワードを追加した文字列を設定します。
Base64のエンコーダが、余計な改行を加えると無効になってしまうため、それを防ぐためにBase64.NO_WRAPというフラグを渡しています。
Nexus7端末を使ったHTTPリクエストのダンプ例を以下のとおりです。
Nexus7端末を使ったHTTPリクエストのダンプ例
GET / HTTP/1.1 Authorization: Basic dXNlcjp1c2Vy User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; Nexus 7 Build/LMY47V) Host: xxx.xxx.xxx.xxx Connection: Keep-Alive Accept-Encoding: gzip
2. Basic認証をアプリ内でグローバルに設定する
アプリ内で実行されるリクエスト全体に対してBasic認証を追加したい場合は、Authenticatorを利用します。Authenticatorを使うと、アプリのプロセスで使うユーザ名とパスワードの証明をグローバルに設定することができます。
Basic認証をアプリ内でグローバルに設定するためには、リクエスト処理を実行する前に以下のコードを1回実行させておく必要があります。
Basic認証をアプリ内でグローバルに設定する
final String USERNAME = "USERNAME"; final String PASSWORD = "PASSWORD"; Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(USERNAME, PASSWORD.toCharArray()); } });
上記コードを実行することで、以降に生成されたURLConnectionはPasswordAuthenticationインスタンスを使って認証するようになります。