ちょっとOAuthをJSPで利用することがあったので備忘録。
今回はFacebookとTwitterを利用するのでOAuth1.1aにもOAuth2.0にも対応したライブラリが必要。
いくつかのライブラリを利用してもよいけれどできることなら一つのライブラリで対応したかったのでこの条件を満たすscribe-javaを利用することに。
このライブラリはサンプルコードも公開されているし実際に使ってみた日本人の方もいらっしゃるみたいだけどどれもこれもJavaアプリケーション。今回はウェブアプリケーションなのでそれ用に書き換える必要が。
scribe_twitter_start.jsp
< %@page contentType="text/html" pageEncoding="UTF-8" import="org.scribe.builder.*,org.scribe.builder.api.*,org.scribe.model.*,org.scribe.oauth.*"%>
< %
OAuthService service = new ServiceBuilder()
.provider(TwitterApi.class)
.apiKey("APIキー")
.apiSecret("APIシークレットキー")
.callback("コールバックさせるURL")
.build();
Token requestToken = service.getRequestToken();
String authUrl = service.getAuthorizationUrl(requestToken);
%>
[Twitter OAuth認証](<%=authUrl%>)
scribe_twitter_end.jsp
< %@page contentType="text/html" pageEncoding="UTF-8" import="org.scribe.builder.*,org.scribe.builder.api.*,org.scribe.model.*,org.scribe.oauth.*"%>
< %
OAuthService service = new ServiceBuilder()
.provider(TwitterApi.class)
.apiKey("APIキー")
.apiSecret("APIシークレットキー")
.build();
String oauth_verifier = request.getParameter("oauth_verifier");
Token requestToken = new Token(request.getParameter("oauth_token"),request.getParameter("oauth_verifier"));
Verifier verifier = new Verifier(request.getParameter("oauth_verifier"));
Token accessToken = service.getAccessToken(requestToken, verifier);
OAuthRequest req = new OAuthRequest(Verb.GET, "http://api.twitter.com/1/account/verify_credentials.xml");
service.signRequest(accessToken, req);
Response resp = req.send();
String xml = resp.getBody();
%>
<title>認証完了</title>
<dl>
<dt>Access Token</dt>
<dd>< %=accessToken.getToken()%></dd>
<dt>Access Token</dt>
<dd>< %=accessToken.getSecret()%></dd>
</dl>
とこういう形になるらしい。
ちなみにFacebookの場合は
scribe_fb_start.jsp
< %@page contentType="text/html" pageEncoding="UTF-8" import="org.scribe.builder.*,org.scribe.builder.api.*,org.scribe.model.*,org.scribe.oauth.*"%>
< %
OAuthService service = new ServiceBuilder()
.provider(FacebookApi.class)
.apiKey("APIキー")
.apiSecret("APIシークレットキー")
.callback("コールバックURL")
.build();
Token EMPTY_TOKEN = null;
String authUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
%>
[Twitter OAuth認証](<%=authUrl%>)
scribe_fb_end.jsp
< %@page contentType="text/html" pageEncoding="UTF-8" import="org.scribe.builder.*,org.scribe.builder.api.*,org.scribe.model.*,org.scribe.oauth.*"%>
< %
OAuthService service = new ServiceBuilder()
.provider(FacebookApi.class)
.apiKey("APIキー")
.apiSecret("APIシークレットキー")
.build();
String oauth_verifier = request.getParameter("code");
Token EMPTY_TOKEN = null;
Verifier verifier = new Verifier(request.getParameter("code"));
Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier);
OAuthRequest req = new OAuthRequest(Verb.GET, "https://graph.facebook.com/me");
service.signRequest(accessToken, req);
Response resp = req.send();
String json = resp.getBody();
%>
<title>認証完了</title>
<dl>
<dt>Access Token</dt>
<dd>< %=accessToken.getToken()%></dd>
</dl>
とまあこんな感じの書き方でいけるようです。
あとは好きなだけAPIを叩きましょう。