wicketでopenID実装

というタイトルですがwicketを触ったのは初めてのため変なプログラムになっている可能性が大ですが・・・

とりあえずopenid4javaをダウンロードしてきます
(今回は最新のver0.9.5ですver0.9.4は動かないらしいので要注意)

openid4java-0.9.5.jarとlib直下にある5つのjarファイルも必須ですのでご注意を!!


今回はmixiopenIDを使って試してみます

Login.javaopenIDでログインのsubmitボタンを押したらログイン処理を実行する)

package login;

import java.util.List;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.protocol.http.RequestUtils;
import org.apache.wicket.request.target.basic.RedirectRequestTarget;
import org.apache.wicket.Session;
import org.openid4java.consumer.ConsumerException;
import org.openid4java.consumer.ConsumerManager;
import org.openid4java.discovery.DiscoveryException;
import org.openid4java.discovery.DiscoveryInformation;
import org.openid4java.message.AuthRequest;
import org.openid4java.message.MessageException;
import application.MySession;

public class Login extends WebPage {
  public Login(){
	  ConsumerManager manager;
	  manager = ConsumerManagerWrapper.getInstance();
	  ((MySession)Session.get()).setManager(manager);
	  //フォームにmixiのログインボタンをaddする
	  final Form form = new Form("form");
	  Button submit = new Button("submit"){
		  @Override
		  public void onSubmit(){
			//submitしたらOpenIDメソッドを実行
			  OpenID("https://mixi.jp/");
		  }
	  };
	  form.add(submit);
	  this.add(form);
  }

  private void OpenID(String fowardurl){
	  ConsumerManager manager = ((MySession)Session.get()).getManager();

	  List discoveries = null;
	  try{
		  discoveries = manager.discover(fowardurl);
	  }catch(DiscoveryException e){
		  e.printStackTrace();
	  }
	  DiscoveryInformation discovered = manager.associate(discoveries);
	  ((MySession)Session.get()).setdiscovered(discovered);

	  //認証成功後にリダイレクトするURL
	  String returnURL = RequestUtils.toAbsolutePath("verify");
	  AuthRequest authReq =  null;
	  try{
		  authReq = manager.authenticate(discovered, returnURL);
	  }catch(MessageException e){
		  e.printStackTrace();
	  }catch(ConsumerException e){
		  e.printStackTrace();
	  }
	  getRequestCycle().setRequestTarget(new RedirectRequestTarget(authReq.getDestinationUrl(true)));
  }
}

//ConsumerManagerのインスタンスを生成
class ConsumerManagerWrapper {

	private static ConsumerManager _instance;

	private ConsumerManagerWrapper(){
		//TODO
	}

	public static ConsumerManager getInstance(){
		try {
			if(_instance == null){
				_instance = new ConsumerManager();

			}
		} catch (ConsumerException e) {
			throw new RuntimeException("ConsumerManager");
		}
		return _instance;
	}
}

Verify.java(ログイン後の処理)

package login;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.Model;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebRequest;
import org.apache.wicket.RequestCycle;
import org.openid4java.message.ParameterList;
import org.openid4java.discovery.DiscoveryInformation;
import org.openid4java.discovery.Identifier;
import org.openid4java.consumer.ConsumerManager;
import org.openid4java.consumer.VerificationResult;
import javax.servlet.http.*;

import application.MySession;

public class Verify extends WebPage {
	private DiscoveryInformation discovered;

	public Verify(){
		discovered = ((MySession)Session.get()).getdiscovered();
		add(new Label("test", new Model(discovered)));

		ConsumerManager manager = ((MySession)Session.get()).getManager();

		HttpServletRequest request = ((WebRequest) RequestCycle.get().getRequest()).getHttpServletRequest();
		ParameterList openidResp = new ParameterList(request.getParameterMap());

		DiscoveryInformation discovered = (DiscoveryInformation) ((MySession)Session.get()).getdiscovered();
		
		//リダイレクトしたときのURL
		//なぜか相対パスだとエラーが出た
		StringBuffer receivingURL = new StringBuffer("http://localhost:8080/openID/verify");
		String queryString = request.getQueryString();
		if(queryString != null && queryString.length() > 0){
			receivingURL.append("?").append(queryString);
		}

		VerificationResult verification = null;

		try{
			verification = manager.verify(receivingURL.toString(), openidResp, discovered);
		}catch(Exception e){
			e.printStackTrace();
		}
		Identifier verified = null;
		if(verification != null){
			//verifiedIDの取得
			verified = verification.getVerifiedId();
		}

		if(verified != null){
			//success to login.
			//TODO
		}else{
			//failed to login.
			//TODO
		}
	}
}

こんな感じでうまく動きました
wicketがよくわからなかったのでwicket回りで結構時間かかった・・・