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は一つのファイルにまとめることもできますが、ここではわかりやすいように二つに分けています)。
- OAuth認証のためのURIを生成し、それにアクセスするためのリンクを表示するoauth-start.jsp
- アプリケーションを許可するTwitterページ
- 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)がおすすめです。
ピンバック: Tweets that mention OAuth認証でTwitterを利用するWebアプリケーション(Javaの場合) | inquisitor -- Topsy.com
参考になりました!
ありがとうございます。
ひとつだけ共有事項です。
provider.retrieveRequestToken(consumer, callbackUri);の部分で401エラーが返ってきてハマリました。
原因は、Twitterのページでアプリを登録する際に、「ブラウザアプリケーション」を選んで、Callback URLを入力し忘れた事でした。
Callback URLを省略してしまうと、自動的にクライアントアプリケーションになります。
再度、ブラウザアプリケーションとして設定し直すと、うまく動くようになりました。
コメントありがとうございます.説明に追記しました.
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を設定してください。
ピンバック: Scala+Lift+OAuth(その0) | K blog