マイペースなプログラミング日記

x86エミュレータやFPGA、WebGLにお熱なd-kamiがマイペースに書くブログ

Basic認証でどこかに接続してみる

WicketにはBase64APIがあるので、これをつかってBasic認証が必要などこかのサーバーに接続するプログラムを書いてみた。Basic認証はユーザー名とパスワードをコロンでつないで、それをBase64にしたものをHTTPヘッダに付加する。HTTPヘッダでは


Authorization: Basic Base64エンコードされたテキスト
というようになっている。


以下ソース(Wicket 1.4-rc4)

まずはHTML
BasicAuthPage.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
        <form wicket:id="form">
            URL:<input type="text" wicket:id="inputURL" /><br />
            ユーザー名:<input type="text" wicket:id="userName" /><br />
            パスワード:<input type="password" wicket:id="password"><br />
            <input type="submit" value="送信" wicket:id="submit" /><br />
            結果:<br /><textarea wicket:id="result"></textarea>
        </form>
    </body>
</html>

上記HTMLに対応したJavaのクラス
BasicAuthPage.java

package basic;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.TextArea;

import org.apache.wicket.model.Model;
import org.apache.wicket.util.crypt.Base64;

import java.net.URL;
import java.net.URLConnection;
import java.net.MalformedURLException;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class BasicAuthPage extends WebPage{
    public BasicAuthPage(){
        Form<Void> form = new Form<Void>("form");
        final TextField<String> inputURL = new TextField<String>("inputURL", new Model<String>());
        final TextField<String> userNameField = new TextField<String>("userName", new Model<String>());
        final PasswordTextField passwordField = new PasswordTextField("password", new Model<String>());
        final TextArea<String> result = new TextArea<String>("result", new Model<String>());

        Button submit = new Button("submit"){
            @Override
            public void onSubmit(){
                String userName = userNameField.getModelObject();
                String password = passwordField.getModelObject();

                String basicSource = userName + ":" + password;
                String basicCrypt = new String(Base64.encodeBase64(basicSource.getBytes()));

                BufferedReader reader = null;

                try{
                    URL url = new URL(inputURL.getModelObject());
                    URLConnection connection = url.openConnection();
                    connection.setRequestProperty("Authorization", "basic " + basicCrypt);

                    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    String line;
                    StringBuilder builder = new StringBuilder();

                    while((line = reader.readLine()) != null)
                        builder.append(line);

                    result.setModelObject(builder.toString());
                }catch(MalformedURLException e){
                    result.setModelObject("URLの形式が不正です");
                }catch(IOException e){
                    result.setModelObject("通信中にエラーが発生しました");
                }finally{
                    try{
                        if(reader != null)
                            reader.close();
                    }catch(IOException ioe){
                         throw new RuntimeException(ioe);
                    }
                }
            }
        };

        form.add(inputURL);
        form.add(userNameField);
        form.add(passwordField);
        form.add(submit);
        form.add(result);
        add(form);
    }
}

アプリケーションクラス

package basic;

import org.apache.wicket.protocol.http.WebApplication;

public class BasicAuthApplication extends WebApplication{
    @Override
    public Class<BasicAuthPage> getHomePage(){
        return BasicAuthPage.class;
    }

    @Override
    public void init(){
        getRequestCycleSettings().setResponseRequestEncoding("UTF-8");
    }
}

フィルタマッピング

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
        <filter-name>BasicAuth</filter-name>
        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>basic.BasicAuthApplication</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>BasicAuth</filter-name>
        <url-pattern>/basic/*</url-pattern>
    </filter-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>