OAuth認証でTwitterを利用するWebアプリケーション(Javaの場合)

APIのためのURLを更新しました(2013.2)。

以前、Twitter APIをOAuth認証で利用する方法(Javaの場合)を紹介しました。

ここでは、コンソール・アプリケーションではなく、WebアプリケーションでTwitterのOAuth認証を利用する方法を紹介します。

例によって、以下を確認してから先に進んでください。

  • http://dev.twitter.com/appsでアプリケーションを登録、Concumer keyとConsumer secretを取得する(クライアントアプリケーションではなくブラウザウェブアプリケーションとして登録すること。Callback URLの入力が必要です。とりあえず、「http://localhost/」などとしておけばいいでしょう。)
  • Commons Codecのcommons-codec-バージョン番号.jarを利用可能にする
  • oauth-signpostのsignpost-core-バージョン番号.jarを利用可能にする

以下の3画面で認証することにします(oauth-start.jspとoauth-end.jspは一つのファイルにまとめることもできますが、ここではわかりやすいように二つに分けています)。

  1. OAuth認証のためのURIを生成し、それにアクセスするためのリンクを表示するoauth-start.jsp
  2. アプリケーションを許可するTwitterページ
  3. Twitterからのコールバックを受信し、access tokenとtoken secretを取得するoauth-end.jsp

OAuth認証の入り口となるoauth-start.jspは以下のようになります。メソッドretrieveRequestToken()を呼び出す際に、コールバック先のURIを指定しています。このURIは自分の環境に合わせて書き換えてください。

<%@page contentType="text/html" pageEncoding="UTF-8" import="oauth.signpost.*,oauth.signpost.basic.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<%
    OAuthConsumer consumer = new DefaultOAuthConsumer(
            ***** Consumer key *****,
            ***** Consumer secret *****);
 
    OAuthProvider provider = new DefaultOAuthProvider(
            "https://api.twitter.com/oauth/request_token",
            "https://api.twitter.com/oauth/access_token",
            "https://api.twitter.com/oauth/authorize");

    session.setAttribute("consumer", consumer);
    session.setAttribute("provider", provider);
 
    String callbackUri = "http://localhost:8080/myweb/twitter/oauth-end.jsp";
    String authUrl = provider.retrieveRequestToken(consumer, callbackUri);
%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Twitter OAuth認証開始</title>
  </head>
  <body>
    <p><a href="<%=authUrl%>">Twitter OAuth認証開始</a></p>
  </body>
</html>

コールバック後の処理を実装するoauth-end.jspでは、OAuthConsumerオブジェクトとOAuthProviderオブジェクトをセッションから取り出して再利用します。

<%@page contentType="text/html" pageEncoding="UTF-8" import="oauth.signpost.*,oauth.signpost.http.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<%
    OAuthConsumer consumer = (OAuthConsumer) session.getAttribute("consumer");
    OAuthProvider provider = (OAuthProvider) session.getAttribute("provider");
 
    String oauth_verifier = request.getParameter("oauth_verifier");
    provider.retrieveAccessToken(consumer, oauth_verifier);
    String accessToken = consumer.getToken();
    String tokenSecret = consumer.getTokenSecret();
 
    HttpParameters hp = provider.getResponseParameters();
    String user_id = hp.get("user_id").first();
    String screen_name = hp.get("screen_name").first();
%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Twitter OAuth認証完了</title>
  </head>
  <body>
    <p>Twitter OAuth認証完了</p>
    <dl>
      <dt>Access Token</dt><dd><%=accessToken%></dd>
      <dt>Token Secret</dt><dd><%=tokenSecret%></dd>
      <dt>user_id</dt><dd><%=user_id%></dd>
      <dt>screen_name</dt><dd><%=screen_name%></dd>
    </dl>
  </body>
</html>

これで認証は終わりです。具体的につぶやく方法などは、Twitter APIをOAuth認証で利用する方法(Javaの場合)Twitter4Jでつぶやく練習を参照してください。

お約束ですが、こういう話を基本から学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。

6 thoughts on “OAuth認証でTwitterを利用するWebアプリケーション(Javaの場合)

  1. ピンバック: Tweets that mention OAuth認証でTwitterを利用するWebアプリケーション(Javaの場合) | inquisitor -- Topsy.com

  2. 参考になりました!
    ありがとうございます。

    ひとつだけ共有事項です。
    provider.retrieveRequestToken(consumer, callbackUri);の部分で401エラーが返ってきてハマリました。
    原因は、Twitterのページでアプリを登録する際に、「ブラウザアプリケーション」を選んで、Callback URLを入力し忘れた事でした。
    Callback URLを省略してしまうと、自動的にクライアントアプリケーションになります。
    再度、ブラウザアプリケーションとして設定し直すと、うまく動くようになりました。

  3. oauth-end.jspにて
    NullPointerExceptionが起きます。

    以下、Tomcatのログです。
    2012/07/09 17:36:10 org.apache.catalina.core.StandardWrapperValve invoke
    致命的: サーブレット jsp のServlet.service()が例外を投げました
    java.lang.NullPointerException
    at org.apache.jsp.oauth_002dend_jsp._jspService(oauth_002dend_jsp.java:63)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:615)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

    どうしたら良いでしょうか?

    • luさん

      oauth-end.jspを直接呼び出すことはありません。
      このJSPは、Twitterから戻ってきたときに自動的に実行されます。
      正しく戻ってこられるように、oauth-start.jspのcallbackUriを設定してください。

  4. ピンバック: Scala+Lift+OAuth(その0) | K blog

コメントは停止中です。