2011年12月18日日曜日

Twitter4j-2.2.xを使ったOAuth認証のコーディング例

【セルフPR】
・KOTOO(http://kotoo.in
という写真のまとめサイトを始めました。見てくれると嬉しいです。

---

以前、こちらのエントリーでTwitter4jの使い方を説明しましたが、2.1系から2.2系で使い方が変わったので、内容を修正しました。

Twitterクライアントを作るに当たって、ラクしてxAuthなんて使わずにちゃんとOAuthを使いましょう、という内容です。

でもいざ探すと、Twitter4jとSignpostの併用なんていう気持ち悪いコーディングや、返ってきたaccess_tokenをユーザーにメモらせたり、JavaScriptで解析したりするコーディング等、もうちょっと工夫しようよ的なサンプルばっかりで使い物にならなかったので、Twitter4jのみを使ってグチャグチャながらも自分で作りました。
(このコードも気持ち悪いんですが。)

■開発環境
・JDK 6
・Android SDK Tools, Revision 13(前のエントリーは6でした。)
・Twitter4j-2.2.4(前のエントリーは2.1.3でした。)

■前提
1.アプリケーション登録が完了している。(※)
※OAuthを使う場合、クライアントアプリであっても、
「ブラウザアプリケーション」として登録する。
2.Twitterに飛ぶためのボタン1つだけのActivity(以下、Activity1)と、
Twitterの認証画面を表示するActivity(以下、Activity2)の構成(※)。
※Activity2用に、WebViewを使ったレイアウトをあらかじめ作成しておく。
このレイアウトに設定したWebViewは、WebView01というIDにしています。

■注意点
1.CALLBACK URLには適当な文字列を設定しておく。
Twitterのアプリ登録で指定したCALLBACK URLとは別にしておいた方が混乱しない。
2.下記コードの中で「oauth_verifier」という文字列が出てくるが、
これはaccess_tokenとaccess_token_secretを付与してもらうためのキー。
3.例外処理は簡略化のために省いています。

■コーディング例
(移行する場合もあると思うので、2.1系は紫色にして、コメントアウトしています。
初めて実装する場合は、青字と赤字だけでOKです。)

●Activity1のコーディング例
1.下記コードを、Activity2を呼ぶために、onCreateメソッド内のsetOnClickListener#onClickメソッドに記述します。
  // 前準備  
  ConfigurationBuilder builder = new ConfigurationBuilder();  
  builder.setOAuthConsumerKey(CONSUMER_KEY);  
  builder.setOAuthConsumerSecret(CONSUMER_SECRET);  
  Configuration configuration = builder.build();  
  // myOauthはOAuthAuthorizationクラス型で、Activity1クラスのクラス変数。  
  myOauth = new OAuthAuthorization(configuration);  
  myOauth.setOAuthAccessToken(null);  
  // TwitterFactory factory = new TwitterFactory();
  // twitterはTwitterクラス型で、Activity1クラスのクラス変数。  
  // twitter =  
  //   factory.getOAuthAuthorizedInstance(
  //     CONSUMER_KEY,
  //     CONSUMER_SECRET);

  // リクエストトークンの取得。  
  // requestTokenはRequestToken型で、Activity1クラスのクラス変数。  
  requestToken = myOauth.getOAuthRequestToken(CALLBACK_URL);
  // requestToken = twitter.getOAuthRequestToken(CALLBACK_URL);

  // ここは2.1系と同じです。  
  // 認証用URLをインテントにセット。
  Intent intent = new Intent(this, Activity2.class);  
  intent.putExtra("auth_url", requestToken.getAuthorizationURL());

  // ここも2.1系と同じです。  
  // アクティビティを起動。
  // REQUEST_CODEは任意のint型の値。
  this.startActivityForResult(intent, REQUEST_CODE);  

2.Activity2で取得した値を使って、access_tokenとaccess_token_secretを取得するために、下記コードをonActivityResultメソッドに記述します。
  // インテントからoauth_verifierを取り出して、
  // access_tokenとaccess_token_secretを取得する。
  AccessToken accessToken =
    myOauth.getOAuthAccessToken(  
      requestToken,  
      intent.getExtras().getString("oauth_verifier"));
  // AccessToken accessToken =
  //   twitter.getOAuthAccessToken(
  //     requestToken,
  //     intent.getExtras().getString("oauth_verifier"));

  // ここからは2.1系と同じです。
  // 連携状態とトークンの書き込み
  SharedPreferences pref =
    getSharedPreferences(
      PREFERENCE_NAME,
      MODE_PRIVATE);
  SharedPreferences.Editor editor=pref.edit();
  editor.putString("oauth_token",accessToken.getToken());
  editor.putString("oauth_token_secret",accessToken.getTokenSecret());
  editor.putString("status","available");
  editor.commit();

  // 設定おしまい。
  finish();  


●Activity2のコーディング例(こっちはTwitter4jは関係無いので2.1系と同じです。)
以下のコードを、ログイン処理を担うActivityクラスのonCreateメソッドに記述します。
このコーディング例では、oauth_verifierを取得して、Intentを介してActivity1に戻すことを想定しています。
  WebView webView = (WebView)findViewById(R.id.WebView01);

  // 画面遷移時にWebView内で画面遷移するようにする。
  // こうしないと、標準ブラウザが開いてしまう。
  webView.setWebViewClient(new WebViewClient(){
    // ページ描画完了時に呼ばれる。
    public void onPageFinished(WebView view, String url) {
      super.onPageFinished(view, url);
      // CALLBACK_URLは注意点1で書いた適当な文字列。
      // Twitter側でやってくれる処理として、
      // 認証完了したら、指定したCALLBACK URLにリダイレクトするので、
      // 遷移先のURLがCALLBACK URLから始まっていたら、認証成功とみなす。
      if(url != null && url.startsWith(CALLBACK_URL)){
        // URLパラメータを分解する。
        String[] urlParameters = url.split("\\?")[1].split("&");

        String oauthToken = "";
        String oauthVerifier = "";

        // oauth_tokenをURLパラメータから切り出す。
        if(urlParameters[0].startsWith("oauth_token")){
          oauthToken = urlParameters[0].split("=")[1];
        }else if(urlParameters[1].startsWith("oauth_token")){
          oauthToken = urlParameters[1].split("=")[1];
        }

        // oauth_verifierをURLパラメータから切り出す。
        if(urlParameters[0].startsWith("oauth_verifier")){
          oauthVerifier = urlParameters[0].split("=")[1];
        }else if(urlParameters[1].startsWith("oauth_verifier")){
          oauthVerifier = urlParameters[1].split("=")[1];
        }

        // oauth_tokenとoauth_verifierをインテントにセット。
        Intent intent = getIntent();
        intent.putExtra("oauth_token", oauthToken);
        intent.putExtra("oauth_verifier", oauthVerifier);

        // 元のActivityに戻す。
        setResult(Activity.RESULT_OK, intent);
        finish();
      }
    }
  });

 // Activity1で設定した認証ページを表示。
 webView.loadUrl(this.getIntent().getExtras().getString("auth_url"));


ツイート編に続く・・・
このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿