久々にPHPネタ。 と言うか、今更ながらOAuth接続を試してみる。
ライブラリ、サンプルはここから http://apiwiki.twitter.com/OAuth-Examples ※PHPライブラリ:http://github.com/abraham/twitteroauth
ちなみにGoogle-codeにもライブラリがあるが、コアのライブラリOAuth.phpは全く同じものだ。 Google-code oauth これが多分、デファクトスタンダードでしょう。
さて、実際にabraham-twitterのサンプルプログラムをちょちょっと改修してテストしてみました。 (リファクタリングしてないので見にくいですが・・・)
ダウンロードしたabraham-twitteroauthの中身 twitteroauthディレクトリがライブラリなので、プログラムで利用するパスに配置します。 ※その他のコンテンツはサンプルプログラムなので不要
まず、Twitterアプリを利用できるように認証の設定が必要です。
(1) Twitterにログインし連携アプリを開く。
(2) 開発者への欄のリンクを開く。 実際のURLは、http://twitter.com/apps
(3) 新しいアプリケーションを追加を開く。 実際のURLは、http://twitter.com/new
(4) 必要項目を入力する。
・アプリケーションのアイコン: 連携アプリに出てくるアイコンです ・アプリケーション名: 何でもよいですが、わかりやすくシンプルな方がいいでしょう ・アプリケーションの説明: ユーザに何をするのかを説明します ・アプリケーションのウェブサイトURL、所属会社/団体、サイト: ここら辺は任意で入力 ・アプリケーションの種類: クライアントアプリケーション = モバイルやデスクトップアプリならこれを選択 ブラウザアプリケーション = ブラウザアプリならこれを選択 要はリダイレクトをTwitter連携アプリでするか、自分のプログラムでするかの違いです。 ・コールバックURL: ブラウザアプリケーションを選択すると入力できます。 ・Default Access type: ユーザの書き込み権限を許可するかどうか? ・Twitterでログインする: Twitterでログインするかどうか? 通常はオンにしておくと楽でしょう。
(5) 設定が完了すると、Consumer keyとConsumer secretが発行されます。
※表示するhtmlソースは記載してません (1) twitteroauth/twitteroauth.phpのパスを通す。
require_once 'twitteroauth/twitteroauth.php';
(2) Twitterアプリの発行したConsumer keyとConsumer secretおよび、手動でコールバックするのであれば、認証後のURLを設定する。
define('CONSUMER_KEY', 'Consumer key');
define('CONSUMER_SECRET', 'Consumer secret');
define('OAUTH_CALLBACK', 'コールバックするURL');
(3) 現在のセッションから認証状況チェック まずPHPセッションを利用してトークンの状況を判断し、処理を振り分けます。
function oauth() {
if (empty($this->session['access_token']) || empty($this->session['access_token']['oauth_token']) || empty($this->session['access_token']['oauth_token_secret'])) {
$this->redirect_to('connect');
}
$access_token = $this->session['access_token'];
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
$this->content = $connection->get('account/verify_credentials');
}
※$this->redirect_to()は、リダイレクトする独自関数
セッションにトークンがなければ認証画面(./connect)にリダイレクトします。 トークンがあれば、TwitterOAuthのget('account/verify_credentials')でTwitter情報を取得し、$this->contentに割り当てます。
(4) セッションクリア処理で、access_token、status破棄し認証画面にリダイレクト
function clear() {
unset($this->session['access_token']);
unset($this->session['status']);
$this->redirect_to('connect');
}
(5) 認証画面
function connect() {
if (!defined('CONSUMER_KEY') || !defined('CONSUMER_SECRET')) {
echo('consumer_key、consumer_secretが設定されていません');
exit;
}
}
念のためCONSUMER_KEY、CONSUMER_SECRETをチェックしてから認証画面を表示します。 ※表示するhtmlソースは記載してません 「Twitterに接続する」をクリックすると./redirectへリンクします。 ※$this->sessionは、セッション管理の独自プロパティで、$_SESSIONみたいなものです
(6) Twitter連携アプリへの認証処理 認証画面からアクセスされる処理です。
function redirect() {
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);
$request_token = $connection->getRequestToken(OAUTH_CALLBACK);
$this->session['oauth_token'] = $token = $request_token['oauth_token'];
$this->session['oauth_token_secret'] = $request_token['oauth_token_secret'];
switch ($connection->http_code) {
case 200:
$url = $connection->getAuthorizeURL($token);
header("Location: {$url}");
break;
default:
echo 'Twitterに接続できません';
}
}
TwitterOAuthのgetRequestToken()でコールバックURLを設定しTwitter連携アプリへ認証処理をします。 認証が成功すると「oauth_token」「oauth_token_secret」が返されるのでセッションに保存します。 またgetAuthorizeURL()でトークンからコールバックURLを取得&リダイレクトします。
(7) コールバック処理
function callback() {
if (isset($_REQUEST['oauth_token']) && $this->session['oauth_token'] !== $_REQUEST['oauth_token']) {
$this->session['oauth_status'] = 'oldtoken';
$this->redirect_to('connect');
}
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $this->session['oauth_token'], $this->session['oauth_token_secret']);
$this->session['access_token'] = $connection->getAccessToken($_REQUEST['oauth_verifier']);
unset($this->session['oauth_token']);
unset($this->session['oauth_token_secret']);
if (200 == $connection->http_code) {
$this->session['status'] = 'verified';
$this->redirect_to('index');
} else {
$this->redirect_to('connect');
}
}
まず、不正なoauth_tokenでないか判別します。 TwitterOAuthのgetAccessToken($_REQUEST['oauth_verifier'])でaccess_tokenを取得し、oauth_tokenを破棄します。 接続がOK(HTTP 200)なら認証後の画面に、失敗した場合は認証画面にリダイレクトします。
(8) 認証後の画面の表示
function index() {
$this->oauth();
}
認証が通ればTwitter情報を表示します。 ※oauth()で$this->contentにTwitter情報が割り当てられているはず