Google App EngineでTwitter4JのOAuth認証を行う


Google App Engineでは、Twitter4Jを用いたOAuth認証を利用することができます。
OAuth認証を利用することで、Twitterアカウントを用いてアプリケーションにログインする認証機能を実装することができます。

図:TwitterのよるOAuth認証ログイン画面

GAEアプリケーションにTwitter4J を利用する流れは以下の通りです。

  1. GAEアプリケーションのプロジェクトを作成
  2. アプリケーションのデプロイ
  3. Twitter Developpersにアプリケーションの登録

1.および2.については「 GAEで新規プロジェクトを作成する」を参考にしてください。
また、3.については、「TwitterでOAuth認証を行う(1:Twitterへのアプリケーション登録)
」が参考になります。

今回はTwiter Developpersへのアプリケーション登録までが済んでいることを前提にソースコードを解説していきます。
Twitter4Jを利用して認証を行う処理の流れは以下の通りです。

  1. Twitterクラスのインスタンス生成
  2. Twitterクラスのインスタンスからリクエストトークン取得
  3. リクエストトークンから認証画面へのリダイレクトURLを取得
  4. 認証後のリダイレクト先でアクセストークンを取得

今回は取得したアクセストークンを利用し、アカウント名を取得するところまで解説します。

詳しくは以下からどうぞ

認証画面に遷移する

まずはログイン(認証)画面に遷移させるところまでを解説します。
以下のソースコードは、ログイン画面にリダイレクトさせるところまでを行うサーブレットです。

TwitterOauthSampleServlet.java

public class TwitterOauthSampleServlet extends HttpServlet {

	public static final String consumerKey = "コンシューマキー";
	public static final String consumerSecret = "コンシューマシークレット";

	static TwitterFactory twitterFactory = new TwitterFactory();

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {

		// Titterオブジェクトの生成
		Twitter twitter = twitterFactory.getInstance();
		twitter.setOAuthConsumer(consumerKey, consumerSecret);

		try{
			// リクエストトークンの生成
			RequestToken reqToken = twitter.getOAuthRequestToken();

			// RequestTokenとTwitterオブジェクトをセッションに保存
			HttpSession session = req.getSession();
			session.setAttribute("RequestToken", reqToken);
			session.setAttribute("Twitter", twitter);

			// 認証画面にリダイレクトするためのURLを生成
			String strUrl = reqToken.getAuthorizationURL();
			resp.sendRedirect(strUrl);
		}catch (TwitterException e){
			Log.info(e.getMessage());
		}

	}
}

12行目および13行目でTwitterオブジェクトを初期化しています。
Twitterクラスのインスタンスは、TwitterFatoryクラスのgetInstanceメソッドを用いて生成されます。
生成したTwitterオブジェクトに対して、 setOAuthConsumerメソッドを用いてコンシューマキーおよびコンシューマーシークレットを指定します。
コンシューマキーおよびコンシューマシークレットは、コンシューマ(アプリケーション提供元もしくはアプリケーションそのものを示す)に固有に割り振られるキーです。
コンシューマキーとシークレットがあればTwitterでOAuth認証が使えてしまうため、他の人には教えないようにしましょう。
それぞれ、アプリケーションをTwitter Developpersに登録することで取得できます。


図:コンシューマキーとコンシューマシークレット

Twitterオブジェクトが作成できたら、そこからリクエストトークンを生成します(17行目)。
ここで生成したTwitterオブジェクトおよびリクエストトークンは、認証後のアクセストークン生成時に利用するため、一旦セッションで保持するようにします(20〜22行目)。
次に生成したリクエストトークンから、認証画面へリダイレクトさせるためのURLを取得します(25行目)。
URLが取得できたら、26行目でリダイレクトします。

なお、認証画面からアプリケーション側へリダイレクトを行う際のリダイレクト先URLの指定は、Twitter Developpersの以下の画面にて行います。


図:リダイレクト先のURLの指定

以上で、以下のようなログイン画面に遷移することができたと思います。

図:Twitter認証画面

リダイレクト先でのアクセストークンの生成

次に、認証後のリダイレクト先での処理について解説します。
ここでは主に、リクエストトークンからのアクセストークン生成を行うます。

以下はリダイレクト先のソースコードです。
CallbackServlet.java

public class CallbackServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws IOException {

		HttpSession session = req.getSession();
		Twitter twitter = (Twitter)session.getAttribute("Twitter");
		String verifier = req.getParameter("oauth_verifier");
		AccessToken accessToken = null;

		try {
			// RequestTokenからAccessTokenを取得
			accessToken = twitter.getOAuthAccessToken((RequestToken)session.getAttribute("RequestToken"), verifier);
		} catch (TwitterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		if(accessToken != null){
			// AccessTokenをセッションに保持
			session.setAttribute("AccessToken", accessToken.getToken());
			session.setAttribute("AccessTokenSecret", accessToken.getTokenSecret());
			resp.sendRedirect("/oauthsuccess");
		}else{
			resp.setContentType("text/plain");
			resp.getWriter().println("AccessTokenがNullってます!");
		}
	}
}

まずは、セッションに保持したTwitterオブジェクトを取り出します(5〜6行目)。
Twitterオブジェクトを取り出したら、TwitterクラスのgetOAuthAccessTokenメソッドを用いて、アクセストークンオブジェクトを取得します(12行目)
第1引数には、こちらもセッションに保持しておいたリクエストトークンを利用します。
また、Twitter認証後にリダイレクトされる際、Httpレスポンスに「ユーザーがOKしたよ」という意味を持つ「oauth_verifier」というパラメータが含まれています。
このVerifierを第2引数に指定することで認証情報を設定します。

こうして取得したアクセストークンオブジェクトから、実際のAccess TokenAccess Token Secretを取得し、セッションに格納します(20行目、21行目)。
この、Access TokenとAccess Token SecretをTwitterオブジェクトにセットすることで、アカウント名の取得やツイートなどを行うことができます。
これらについては以下の記事を参考にしてみてください。AndroidでTwitter4Jを取り扱う記事ですが、やるべきことは同じです。
Twitterの”つぶやき”を実装する
ここでは、上記記事を参考に生成したTwitterオブジェクトから、TwitterクラスのgetScreenNameメソッドを利用して取得したアカウント名を画面に表示しています。

OauthSuccess.java

		String screenName = null;
		try {
			// Twitterオブジェクトからアカウント名を取得
			screenName = twitter.getScreenName();
		} catch (TwitterException e) {
			e.printStackTrace();
		}

		resp.setContentType("text/plain");
		resp.getWriter().println("Hello, " + screenName + "!");

以上でTwitter認証成功です!

補足

GAEでSessionを利用するには、appengine-web.xmlファイルに以下の記述が必要です。
appengine-web.xml

  <sessions-enabled>true</sessions-enabled>

セッションは、オブジェクトをサーバー側で一定期間保持する仕組みです。
セッションを利用することで、Servlet間をまたいで情報を共有することが可能です。
セッションに保持した情報は、セッションキーと呼ばれる一意なキーを用いて引き出して利用できます。
Javaではセッション管理を自動で行ってくれるため、HttpSessionインターフェースを用いることで、セッションキーを用いて簡単に情報の保持と取得が行えます。

本サイトでは、AndroidでTwitter4JのOAuth認証を行う方法についても解説していますので、そちらも参考にして下さい。