強火で進め

このブログではプログラム関連の記事を中心に書いてます。

TwitterのOAuth認証を使う

(2010/06/18 追記)
OAuthのみへの移行がワールドカップによる負荷を理由に8月16日からに変更されました。

moving the OAuth switch over date to august 16, 2010 - Twitter Development Talk | Google グループ
http://groups.google.com/group/twitter-development-talk/browse_thread/thread/dfb89d9f29f339a2?pli=1

段階的に移行が行われ、8月31日からはBASIC認証が完全に使えなくなる様です。

Twitterブログ: Twitter APIデベロッパー・コミュニティへのお知らせ (oAuthへの移行に関しての期限延長)
http://blog.twitter.jp/2010/06/twitter-api-oauth.html

2010年6月30日でTwitterの認証が必要なTwitter APIBASIC認証を使ってアクセスする事ができなくなります。

TwitterBASIC認証廃止、企業ユーザーが知っておくべきこと - ITmedia エンタープライズ
http://www.itmedia.co.jp/enterprise/articles/1004/28/news012.html

それ以降にTwitter APIを使うにはOAuthかxAuthに対応する必要があります。
Twitterなどを見てるとなにやらxAuthを使う人が多いのですがxAuthは承認を受けるためのメールを送るなど手間も多いみたいです。

OAuthは難しそうと印象からxAuthにする人が多いのでしょうがOAuthもライブラリを使えばそんなには難しくありません。

また、OAuthであればTwitterで利用するために必要なアプリの登録申請が即、通るので素早いリリースが可能です。

という事でちょっと解説のエントリーを書いてみました。

この記事は 2010/05/20 時点での情報を元に書いています。将来的には変更が行われる部分も有るかもしれませんので閲覧の時期によってはその点ご注意下さい。

アプリの登録申請

まずは以下のページでtwitterでのOAuth利用のための登録申請を行います。
http://twitter.com/oauth_clients

ほとんどの項目は改めて説明する必要の無いものが多いので注意が必要なもののみ説明します。

【アプリケーションの説明】
短過ぎるとエラーとなります。ある程度長い文章を書きましょう。

【アプリケーションの種類】

選択項目 説明
クライアントプリケーション 実行ファイルを起動するようなディスクトップ系のアプリのときに選択します。
ブラウザアプリ ブラウザで動作するアプリのとき選択します。こちらを選択した場合、ユーザによるOauth認証の承認が完了した後に表示するURLを指定する事が出来ます。

なお、今回の解説では「クライアントプリケーション」で登録している事を前提に話を進めます。
※この設定を含む全ての項目は後で変更する事も可能です。

【Default Access type】
つぶやきの投稿やデータ更新を行う場合は「Read & Write」、データの取得のみを行う場合は「Read-only」を選択します。


なおユーザがOAuthによるユーザデータへのアクセスを許可をした場合はユーザの「設定」-「連携アプリ」の画面に以下の様に表示されます。この画面でユーザは許可を取り消す事もできます。

ライブラリ

OAuthは自前でやるとかなり大変なので以下のライブラリを使用します。

bengottlieb's Twitter-OAuth-iPhone at master - GitHub
http://github.com/bengottlieb/Twitter-OAuth-iPhone

ターミナルでDLしたいディレクトリに移動し、以下のコマンドを実行して下さい(gitがインストール済みで有る必要が有ります)。

git clone http://github.com/bengottlieb/Twitter-OAuth-iPhone.git

こちらのライブラリにはサンプルが付属しており、DLしたディレクトリ内の Demo というディレクトリに入っているプロジェクトがサンプルとなります。こちらを開いて下さい。

次に「Code」グループの中のファイル OAuthTwitterDemoViewController.m の先頭の以下の2つの定数に登録完了時に表示された「Consumer key」と「Consumer secret」の文字列を設定します。

#define kOAuthConsumerKey				@""		//REPLACE ME
#define kOAuthConsumerSecret			@""		//REPLACE ME

このサンプルの起点となる部分は OAuthTwitterDemoViewController.m の - viewDidAppear: になります。処理を追いたい場合はここから始めると良いでしょう。

ざっくりと解説しておくと _engine がメインの処理エンジンとなります。 SA_OAuthTwitterEngine クラスを追っかけると詳細が理解できます。

続いて、 SA_OAuthTwitterController の生成と表示が行われます。 SA_OAuthTwitterController の + controllerToEnterCredentialsWithTwitterEngine:delegate: ですがこのメソッドは認証済みの場合は nil を返します。

	UIViewController			*controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];

そのため、続く以下の部分でまだOAuth認証のユーザからの承認が終わってない場合は認証用の画面が表示され、既に承認が終わってる場合にはつぶやきの投稿が行わる様に処理が分岐します。

	if (controller) 
		[self presentModalViewController: controller animated: YES];
	else {
		[_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]];
	}

そのためこのアプリは1回目の起動で認証を終わらせた後に再度起動すると else のブロックの方に分岐しつぶやきの投稿が行われます。この動作が嫌な人はこの部分を NSLog などに書き換えておきましょう。

つぶやきの投稿以外に実行可能なものは MGTwitterEngine.h の以下の記述以降に記載があります。

#pragma mark REST API methods

自分が試したときは「つぶやきの検索」などが上手く動作しませんでした。深くは追ってないのですがOAuthの必要が無いので実装してないのかな?と思っています。まぁOAuthを使わないものは必要なパラメータを指定してアクセスするだけで良いので自前で準備してもそんなに負担になることも無いでしょう。

ビルド

それではビルドして動作させてみましょう。もし、以下の様なエラー文が表示される場合は使用しているXcodeがプレリリース(ベータ)版でないか確認して下さい。プレリリース版ではエラーとなる様なので正式(fainal)版を使用してビルドして下さい。

Undefined symbols:
  "_OBJC_CLASS_$_OAConsumer", referenced from:
      objc-class-ref-to-OAConsumer in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OAToken", referenced from:
      objc-class-ref-to-OAToken in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OAMutableURLRequest", referenced from:
      objc-class-ref-to-OAMutableURLRequest in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OADataFetcher", referenced from:
      objc-class-ref-to-OADataFetcher in SA_OAuthTwitterEngine.o
  "_OBJC_CLASS_$_OARequestParameter", referenced from:
      objc-class-ref-to-OARequestParameter in SA_OAuthTwitterEngine.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

実際に試してみるとWebViewでのやりとりが続く事が確認できると思います。

なお、本来であれば最後の辺りでPINという7桁の数字をユーザにTextFieldなどにコピペして貰い、それをプログラムでTwitterのサーバへ投げる処理が必要なのですがこのライブラリではHTMLをパースしてその部分を自動的に取得して最終的なアクセストークン(twitterサーバにREST APIでアクセスするときにこの値をパラメータに含める)の取得するところまでやってくれます。

Twitter API Wiki / Authentication
http://apiwiki.twitter.com/Authentication

ユーザID、パスワードを入力してOAuthの許可が完了したらもう一度アプリを起動してみましょう。プログラムを変更していない場合は自分がOAuthの許可をしたユーザIDのつぶやきとして以下の様なつぶやきが投稿されているが確認できると思います。

おまけ

なお、twitterのサーバから返される情報のパースは以下の id:tomute さんのサイトで丁寧な解説が有るJSON Frameworkなどを使うと簡単に行えてオススメです。

Objective-CJSON Frameworkを使ってTwitterの情報等を取得する方法 - Tomute’s Notes
http://d.hatena.ne.jp/tomute/20090518/1242687954

関連情報

OAuth関連の専門用語 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20100531/1275329032

やる夫で学ぶOAuth 〜やる夫がユニクロの行列に並んだようです〜 - くらげのBlog
http://d.hatena.ne.jp/ku__ra__ge+blog/20100531/1275331398

OAuthプロトコルの中身をざっくり解説してみるよ - ゆろよろ日記
http://d.hatena.ne.jp/yuroyoro/20100506/1273137673

Yahoo!デベロッパーネットワーク - OAuth - フロー
http://developer.yahoo.co.jp/other/oauth/flow.html

OAuth Core 1.0
http://oauth.net/core/1.0/#anchor9

iPhoneTwitter OAuth認証の流れについて » いとーけーのページ
http://itok.jp/blog/2010/01/13/iphone_twitter_oauth_gui/

OAuthやxAuthなどもについての解説が書いてあるTwitter APIの解説本。
日頃からTwitter APIをよく使っている方が書かれた本という印象で「twitterの負荷で挙動が…」などの体験に基づいた情報も有る実践的な内容でした。

Twitter API プログラミング

Twitter API プログラミング

xAuthの申請についてはこちらサイトが参考になります。最初は1週間の期限付きになるなど色々と注意すべき事が有る様です。

xAuthの申請方法をまとめました
http://blog.elearning.co.jp/?p=8909

Twitter-OAuth-iPhoneを使ってcocos2dプロジェクトからゲーム情報をpostする - 〜けものみちを目指して〜Only the Paranoid Survive
http://d.hatena.ne.jp/jarinosuke0808/20101019/1287496640

TwitPicのOAuthEcho対応 | iphoneアプリで稼げるのか
http://iphone.longearth.net/2010/08/05/twitpic%E3%81%AEoauthecho%E5%AF%BE%E5%BF%9C/

Twitter API を OAuth で認証するスクリプトを 0 から書いてみた - trial and error
http://techno-st.net/2009/11/26/twitter-api-oauth-0.html