既存のウェブアプリケーションと連携するアプリケーションを作成する

はじめに

SOAというキーワードが取り上げられるようになり、ウェブサービス技術が注目されてきていますが、既存のウェブアプリケーションと連携するアプリケーションを開発しなければいけないこともあります。

本日から数日を使って、Javaを使って、既存のウェブアプリケーションと連携するアプリケーションをどのように開発するかについてご紹介したいと思います。第一日として、まずユーザ認証をどのように行うかについて解説します*1

ユーザ認証

ユーザ認証を必要とするウェブサーバと通信する際、どのようにユーザ認証を行うかが問題になります。RFC 2396あたりを参照すると、プロトコル://ユーザ名:パスワード@ホスト:ポート/という形式が定義されているのですが、残念ながらjava.net.URLではこの形式のURLを渡すことによるユーザ認証はできないようです。

その代わりになるものとして、Javaではjava.net.Authenticatorというクラスが用意されています。
java.net.Authenticatorの使い方は簡単です。

  1. java.net.Authenticatorを継承する具象クラスを作成します。
    • protected PasswordAuthentication getPasswordAuthentication()をオーバライドしてください。
  2. URLオブジェクトを使った通信が発生する前の段階で、java.net.Authenticator.setDefault()メソッドを使い、作成したjava.net.Authenticatorを継承する具象クラスのインスタンスをデフォルトの認証機として設定します。

ソースコードで見ていきましょう。まずはAuthenticatorを継承する具象クラスの定義です。URLオブジェクトが認証を必要とするとき、これから作成する具象クラスのgetPasswordAuthentication()メソッドがコールバックされることになります。

public class MyAuthenticator extends java.net.Authenticator{
private String user;
private String pass;
public MyAuthenticator(String user, String pass)
{
this.user = user;
this.pass = pass;
}

protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(user,pass.toCharArray());
}
}

このクラスを使ってユーザ認証をするアプリケーションを書いて見ます。

public class DoAuth{
public static void main(String [] args )
throws Exception
{
MyAuthentication auth = new MyAuthentication("user1", "pass1");
java.net.Authenticator.setDeafault(auth);

URL url = new URL("http://somewhere.requries.auth/");
url.openConnection();
//以下略
}
}

これで、ユーザネームとしてuser1, パスワードとしてpass1を使う認証ができるようになります。

*1:昨日の記事に書いたDIGEST認証とストーリーとしてはつながっています