2010/06/19

wicketのoauth認証サンプルをappengineに載せる

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でサンプルが動作するようになります。
動作例はこちら