OpenID with Wicket その5
この話の続きです。
OpenID with Wicket その3
http://d.hatena.ne.jp/nigredo/20081129/1227972864
もともとOpenIDを使おうとしたときに参考にしたページでは、ブックマーク可能ページにしてそこをOpenIDプロバイダに戻りページとして投げてやればいいよみたいなことが書いてあったので、試したのだがうまくいかない。そこでしょうがなくコンテキストトップのURLをOpenIDプロバイダからの戻りにして、分岐させてやったけど、なんかカッコ悪いよね。自分は変な勘違いをしているんじゃないかとよくよく考えたんだけど・・・
もしかしてブックマーク可能ページにした戻りページは実はNice URLにするのでは・・・
そう考えてやってみた。考えるの遅すぎ!!
まず、Nice URLの設定。VerifyPageのアクセスを/verifyでできるようにする。
public class HogeApplication extends WebApplication {
protected void init() {
super.init();
// OpenID検証用ページ
mountBookmarkablePage("verify", VerifyPage.class);
}
次にログインしようとするページです。ページにはログインリンクなりがあり、リンクのクリックイベントでonClickLogin( )が呼び出されるとします。
※例外キャッチは省略している。
public class HogePage extends Page {
private void onClickLogin(){
// ログインリンク
Link linklogin = new Link("login"){
public void onClick(){
onClickLogin();
}
};
add(linklogin);
...省略
MySession sess = (MySession)getSession();
// コンシューママネジャを取得
//注! ConsumerManagerWrapperは、シングルトンクラスで、ConsumerManagerを返します。
ConsumerManager manager = ConsumerManagerWrapper.getInstance();
// 遷移先を設定
List discoveries = manager.discover(sess.getUserId());
DiscoveryInformation discovered = manager.associate(discoveries);
sess.setDescoveryInformation(discovered); // VerifyPageまで引き継ぐ
//Nice URLでhttp://example.jp/appname/verify を戻り先とする。
String returnURL = RequestUtils.toAbsolutePath("verify");
AuthRequest authReq = null;
authReq = manager.authenticate(discovered, returnURL);
// authentication
if(authReq != null){
// 次の遷移先をOpenIDプロバイダにして、認証を委譲する。
getRequestCycle().setRequestTarget(new RedirectRequestTarget(authReq.getDestinationUrl(true)));
}
}
}
最後に今回作ったVerifyPageです。このページがOpenIDプロバイダからの認証後の戻りページとなります。ここで認証されたか、拒否されたかを判断するわけですね。
※例外キャッチは省略している。
public class VerifyPage extends AbstractPage{
public VerifyPage(PageParameters params){
HttpServletRequest request = ((WebRequest) RequestCycle.get().getRequest()).getHttpServletRequest();
// receivingURL
StringBuffer receivingURL = request.getRequestURL();
String queryString = request.getQueryString();
if (queryString != null && queryString.length() > 0){
receivingURL.append("?").append(request.getQueryString());
}
VerificationResult verification = null;
MySession sess = (MySession)getSession();
ParameterList openidResp = new ParameterList(request.getParameterMap());
ConsumerManager manager = ConsumerManagerWrapper.getInstance();
DiscoveryInformation discovered = sess.getDescoveryInformation();
verification = manager.verify(receivingURL.toString(), openidResp, discovered);
Identifier verified = null;
if(verification!=null){
verified = verification.getVerifiedId();
}
if (verified != null){
// 詳細ページに遷移
setResponsePage(DetailInput.class);
return;
}
// 認証が拒否された!
}
}
一応、これでできました。疑問なんだけど、ブックマーク可能ページにするためにコンストラクタ引数としてPageParametersを定義しているけど、これってダミーになるのかな?もしかしたらVerificationResult#( )するためのURLをここからとれるのかな。