wicketでopenID実装
というタイトルですがwicketを触ったのは初めてのため変なプログラムになっている可能性が大ですが・・・
とりあえずopenid4javaをダウンロードしてきます
(今回は最新のver0.9.5ですver0.9.4は動かないらしいので要注意)
openid4java-0.9.5.jarとlib直下にある5つのjarファイルも必須ですのでご注意を!!
Login.java(openIDでログインの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 } } }