OAuth

最初の障害「OAuth」

Twitterのタイムラインを取得したり送信するためには、当然ながらユーザ認証が必要です。

Basic認証というIDとPassをアプリから入力する方も有ったのですが、2010/08にTwitter側でBasic認証を廃止。

よりセキュアな認証方式として、OAuthが必要になりました。

OAuthにより、クライアントはIDとPassを直接保存する必要がないため、セキュリティを独自に作りこむ必要がなくなりました。

ユーザ視点でも、クライアントにPasswordを入力しなくてよいため、心理的に安心という利点があります。

では、OAuthをどうやって実装するのか?

必要な工程は3つです。

    1. Twitterに、事前に作成するアプリの登録を行う。

    2. プログラムにOAuthを組み込む準備(APIの登録)

    3. OAuthのサンプルを修正する場合(getOAuthAuthorizedInstance)

ちなみに、OAuthについての仕組みを知りたい人は、こちらのHPが良さそうです(私は読み切っていません)

ゼロから学ぶOAuth

http://gihyo.jp/dev/feature/01/oauth

OAutheは、簡単にいうと次のような手順でアプリに使用権限を許諾します。すでに、Twitterのユーザさんなら経験済みな仕組みだと思います。未経験の人は、何かClientをダウンロードして使ってみてください。

    1. アプリからTwitterサーバのWeb画面へアクセスする。

    2. TwitterのWeb上でユーザがアプリを許可する。

    3. Twitterサーバから、許可情報(トークン)をアプリが受け取る。

1. Twitterに、事前に作成するアプリの登録を行う。

OAuthで認証するためには必須な手続きである。アプリを作る前に登録しておくことも可能。

登録は、Twitterのこのページへ(Register a new appをクリック)

https://dev.twitter.com/apps/

登録内容についての解説は、下記の2つのHPのページがおススメ。

Tech Booster

http://techbooster.jpn.org/andriod/mashup/4525/

HishidamaさんのHP

http://www.ne.jp/asahi/hishidama/home/tech/twitter/auth.html

この登録の中で、Callback URLに何を登録すればいいのか迷いました。

結論は、何でもいいです。私は下記にしました。何でもいい理由は、プログラム解説の中で触れたいと思います。

http://twitter.com/

2. プログラムにOAuthを組み込む準備(APIの登録)。

さて、OAuthを組み込むのに最も情報が多いのが、Twitter4jというAPIを用いた実装方法なので、勉強を兼ねてトライしてみました。

まず、Twitter4jの入手。公式HPのダウンロードから入手。私は、「(Android向けのスリムバージョン)」を落としました。

http://twitter4j.org/ja/

eclipse環境でのtwitter4jの組み方は、下記のHPが参考になりました。

ただし、これはAndroid以外での組み込みなので、ライブラリの追加(D.プロジェクトの作成・T4Jの追加)を参考にします。

陽昇れども地の底に光届かず

http://sites.google.com/site/elekmole/twitter4jtop

私は、jarファイルを1個ずつ登録するのではなく、「外部クラス、フォルダーの追加」で、解凍したtwitter4jのlibディレクトリを登録しました。

ダメでした。「外部 jar 追加」で、twitter4jのjarファイル全部を登録しました。

ちなみにjavadocとsourceをeclipsに登録することで参考にできる情報を増やすことができます。

下記のHPが参考になりました。各jar毎に登録するのはちょっと大変でしたけど。一気に登録する手段があればなぁ。

Tech Booster

http://techbooster.jpn.org/andriod/environment/4897/

3.OAuthのサンプルを修正する場合(getOAuthAuthorizedInstance)

各 自で入手したサンプルが、TwitterFactory()のgetOAuthAuthorizedInstance()を用いていた場合、 Twitter4jの2.0.0からgetOAuthAuthorizedInstanceが廃止されたため修正する必要があります。

修正は簡単です。

    1. new TwitterFactory()でインスタンスを作っているところを、new ConfigurationBuilder()に変更。

    2. getOAuthAuthorizedInstance(CONSUMER_KEY,CONSUMER_SECRET) としているところを、setOAuthConsumerKey(CONSUMER_KEY)と setOAuthConsumerSecret(CONSUMER_SECRET)の2行で記述する。

    3. 2の下に、Configuration configuration = confbuilder.build();を追加する。

    4. private OAuthAuthorization myOauthを、クラスの先頭に追加(各メソッドで共通に使う)

    5. 4 で定義したインスタンスにnew OAuthAuthorization(configuration)を入れる。この方法を行わないと、getOAuthRequestTokenで IllegalStateException: OAuth consumer key/secret combination not suppliedというエラーが発生する。

    6. twitter4jのversionによっては、4のインスタンスに対して、myOauth.setOAuthAccessToken(null)を行う。IllegalStateExceptionになるらしい。2.2.2では発生せず。

こちらの記事が参考になります。

YUJimny備忘録

http://d.hatena.ne.jp/yujimny/20110204

OAuthのサンプルコードは、こちらを参考にしました。

Kyosuke Yoshimura さんのandroid日記

http://blog.kyosuke25.com/2010/08/twitter4joauth.html

// TODO TwitterのHPに登録したCallback URLが何でもいい理由を書くかも。

「OAuth」で取得した物を使って、タイムラインの取得

OAuthでトークンらしいものを取得したら一気に満足したわけですが、ここからがやっと本番です。

Twitter4jを用いて、タイムラインの取得から。

要素としては、次のステップになります。

1.不揮発領域(preferenceなど)に保存したAccess TokenとAccess Token Secretを読みだします。

Twitter4jでは、取得したAccess TokenとAccess Token Secretを合わせた4つを登録したインスタンスで操作します。

2.ConfigurationBuilderを用いてtwitter4j用のconfをBuildします。

下記のページの使い方が参考になります。

陽昇れども地の底に光届かず(ConfigurationBuilder)

http://sites.google.com/site/elekmole/twitter4jtop/configurationbuilder

3.認証情報を登録したtwitter4jのインスタンスを生成する。下記のページに答えがあります。

YUJimny備忘録

http://d.hatena.ne.jp/yujimny/20110204

4.作ったインスタンスで、getHomeTimeline()のメソッドを用いて取得する。

簡単すなー。

ちなみに、Twitter4jでは、Statusというクラスで取得した情報を使用できるようになっています。

Statusは、List型なのでget(location)で好きな位置のStatusを取得できます。

Status settingData = twitter_statuses.get(0);

settingData.getText()

Statusの中の構造は、こちらがわかりやすいです。

陽昇れども地の底に光届かず(Status)

http://sites.google.com/site/elekmole/twitter4jtop/02-status-class

また、Statusのmethodは、公式Java docがおススメです。

http://twitter4j.org/ja/javadoc/twitter4j/Status.html