6/20追記 index.htmlの削除と、エラー処理の修正。
矢野 勉さんの記事、Wicketで始めるオブジェクト指向ウェブ開発の第9回 WicketによるOAuth認証を、Google App Engineに載せてみました。appengine上のURLはこちら。
ソースコードの修正は、appengineに載せるための修正と、Twitter4Jの最新版を使うための修正です。
1. ソースコードの入手
第9回のソースコードをダウンロードし、解凍する。
2. AppEngineプロジェクトの作成
Eclipseで新しいAppEngineプロジェクトを作成。プラグインの入手方法やプロジェクトの作成方法はこちら(山下さんの記事)。作成する際に下記の設定を行う。
- プロジェクト名はwicket-sample-oauth
- パッケージは"jp"
- User Google Web Toolkitはオフ
作成後、下記のファイルを削除。(6/20 追記)
- war/index.html
3. ライブラリの入手
下記のライブラリをダウンロードし、war/WEB-INF/lib内に必要なjarを置いて、ビルドパスに追加。
- Apache Wicket
・wicket-1.4.9.jar - SLF4J
・slf4j-api-1.6.0.jar
・slf4j-jdk14-1.6.0.jar(又はお好みでLog4J用やcommons-logging用を) - Twitter4J
・twitter4j-core-2.1.2.jar
4. ソースコード上書き
解答したソースを、下記のように上書き。
- src/main/javaをプロジェクトのsrcに。
- src/webapp/WEB-INF/web.xmlをプロジェクトのwar/WEB-INFに。
5. ソースコード修正
上書きしたソースの、下記の部分を修正(赤が変更点)。
- jp.gihyo.wicket.TwitterClientを削除。このクラスは、当時のTwitter4Jがシリアライズに対応していないために用意されたクラス。最新版ではシリアライズに対応しているため、不要です。
- jp.gihyo.wicket.AppSession#login
下記は、Twitter4Jの最新版を使うための修正です。public boolean login(String pin, Response response) {
try {
if(requestToken == null) {
throw new IllegalStateException("requestToken is missing.");
}
Twitter client = new TwitterFactory().getInstance();
client.setOAuthConsumer(consumerKey, consumerSecret);
AccessToken accessToken = client.getOAuthAccessToken(requestToken, pin);
client = new TwitterFactory().getOAuthAuthorizedInstance(
consumerKey, consumerSecret, accessToken);
this.twitterSession = client;
dirty();
return true;
} catch(TwitterException ex) {
LOGGER.error("Can not setup OAuth Access Token to Twitter object.", ex);
return false;
}
} - jp.gihyo.wicket.AppSession#getTwitterSession
下記は、Twitter4Jの最新版を使うための修正です。public Twitter getTwitterSession(Request request) {
if(request == null) throw new IllegalArgumentException("'request' is missing");
//既にTwitterオブジェクトを作成済みなら,認証の必要はない。
if(twitterSession != null) return twitterSession;
//AccessTokenをDBなどに永続化している場合は,ここで永続化したAccessTokenを使って
//Twitterオブジェクトを再作成して返却すればよい。
//このサンプルではAccessTokenを永続化していないので,すぐにOAuth認証に入る。
//OAuth認証開始。RequestTokenの取得を試みる。
Twitter client = new TwitterFactory().getInstance();
client.setOAuthConsumer(consumerKey, consumerSecret);
... - jp.gihyo.wicket.WicketApplication
以下のメソッドを追加。Wicketアプリケーションをappengineに載せるための設定です。何故これが必要かはここに解説があります。@Override
protected ISessionStore newSessionStore() {
return new HttpSessionStore(this);
}
@Override
public String getConfigurationType() {
return Application.DEPLOYMENT;
} - jp.gihyo.wicket.AppSession#getTwittersession(6/20 追記)
以下の修正を行う。Twitter呼出時の例外を修正。Twitterがエラーを返した場合の処理を改善します。
public Twitter getTwitterSession(Request request) throws TwitterException{
if(request == null) throw new IllegalArgumentException("'request' is missing");
//既にTwitterオブジェクトを作成済みなら,認証の必要はない。
if(twitterSession != null) return twitterSession;
...
RequestToken token = null;
try {
token = client.getOAuthRequestToken(RequestUtils.toAbsolutePath("login"));
} catch(TwitterException ex) {
throw ex;
}
...
6. Twitterにアプリケーションを登録
アプリページへ行き、アプリケーションを登録する。
登録方法は、第9回 WicketによるOAuth認証の記事内にあります。
登録後、consumer-keyとconsumer-secretをweb.xml内に設定。
7. セッションを有効にする
war/WEB-INF/appengine-web.xml内に、次の1行を追加する。
<sessions-enabled>true</sessions-enabled>
以上の設定・変更を行った上で配備すると、appengineでサンプルが動作するようになります。
動作例はこちら
0 件のコメント:
コメントを投稿