2013年5月16日木曜日

Android Twitter4JでOAuth認証する

Twitter4JでOAuth認証するための方法を調査した時のメモ。

Callback URLを使わずお手軽にすませる方法を使った。 この場合はTwitterログインの後にPIN番号が画面に表示されるので、それを手で入力して認証を完了する。 大まかな手順は次のようである。

  1. TwitterにRequestTokenトークン要求
  2. Twitterから認証のためのログインページURLが返されるのでブラウザで表示
  3. ユーザーがログインしてアプリを許可するとTwitterがPIN番号を発行
  4. TwitterにPINを渡してAccessトークン取得

今回紹介するコードはAndroidアプリつぶマップで使用しているので、 どのように動くか興味ある方はインストールしてもらえるとよいかと思う。

「つぶマップ」ダウンロードサイトへ

Twitter4Jラッパークラス

RequestTokenトークン要求とAccessトークン取得の際、素のままのTwitter4J APIを呼び出してもよいが、 それぞれの処理間での値の保持のためラップしたクラスを作成し呼び出すようにした。
public class TwitterTest {

  private static final String CONSUMER_KEY = "アプリに発行されたConsumer Key";
  private static final String CONSUMER_SECRET = "アプリに発行されたConsumer Secret";
  
  private Twitter twitter;
  private RequestToken requestToken;
  
  public String requestToken() {
    // インスタンスの初期化
    twitter = TwitterFactory.getSingleton();

    // Twitterに登録したアプリのConsumer key と Consumer secretを設定
    twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);

    // RequestTokenトークン要求
    // 認証ページのURLを返すのでWebViewで表示しユーザーにログインしてもらう
    requestToken = twitter.getOAuthRequestToken();
    return requestToken.getAuthorizationURL();
  }
  
  // Accessトークン取得。引数にWebで表示されたPINを入れる。
  // 認証済みのTwitterインスタンスを返す
  public Twitter getAccessToken(String pin) throws TwitterException {
    if (requestToken == null) return false;
    
    // RequestTokenとPINよりAccessトークン取得
    AccessToken _accessToken = twitter.getOAuthAccessToken(requestToken, pin);
    return twitter;
  }
}

アプリ側

アプリ側ではラッパークラスを使い次のようにコードを書く。

まず、TwitterにRequestTokenトークン要求する。ラッパークラスのrequestToken()メソッドを呼び出す。

TwitterTest t = new TwitterTest();
String url = t.requestToken();

メソッド呼び出しの結果、認証のためのTwitterへのログインページURLが返されるのでこのURLをWebViewに表示する。 以下のような画面が開く。同じ画面の上部にはPIN番号を入力するためのEditTextを配置した。

ログインページでユーザーがログインしてアプリを許可するとTwitterがPIN番号を発行する。 画面表示されたPIN番号をユーザーに入力してもらう。

入力されたPINを引数にラッパークラスのgetAccessToken()メソッドを呼び出すことで認証が完了する。

String pin = "ユーザー入力のPIN番号";
Twitter twitter = t.getAccessToken(pin);

メソッドの返り値である認証済みTwitterインスタンスを使ってツイート取得や検索ができる。 以下は検索の例である。

Query q = new Query();
q.setQuery("キーワード");
QueryResult qr = twitter.search(q);

皆さんもぜひ試してみてください。

0 件のコメント:

コメントを投稿