CakePHPでOAuth
Twitter等で使われているOAuthをCakePHPで使うライブラリを紹介します。
OAuth consumers for CakePHP - by cakebaker
導入方法
使い方
Twitterを例にして説明します。Twitter以外のサービスを利用する場合も基本的には同じです。
大まかな流れは次の様になります。
・事前準備
Webサービスの立ち上げ前に、Twitterからconsumer keyとconsumer secretをあらかじめ取得しておく
・認証とAPI利用の流れ
- Twitterからリクエストトークンを取得
- Twitterの認証ページへリダイレクト
- ユーザにログインしてもらう
- ログイン後、あらかじめ設定しておいた自サイトのURLにTwitterがリダイレクトしてくれる
- Twitterからアクセストークンを取得
- 取得したアクセストークンを使ってTwitterのAPIを実行
それでは具体的に説明して行きます。
事前準備
OAuthを使う際には、立ち上げようとするWebサービス毎にconsumer keyとconsumer secretというものが必要になります。consumer keyとconsumer secretはサービスの提供者側から取得します。Twitterの場合はhttp://twitter.com/oauth_clients で取得する事ができます。
認証とAPI利用の流れ
1. ライブラリの取り込み
App::import('Vendor','oauth',array('file'=>'OAuth'.DS.'oauth_consumer.php'));
$consumer=new OAuth_Consumer(取得したconsumer key,取得したconsumer secret); $requestToken=$consumer->getRequestToken( 'http://twitter.com/oauth/request_token', 'http://認証後のリダイレクト先'); // 認証後に使うので保存 $this->Session->write('request_token',$requestToken);
3. Twitterの認証ページへリダイレクト
$this->redirect('http://twitter.com/oauth/authorize?oauth_token='.$requestToken->key);
この後、ユーザにTwitterの認証ページでログインしてもらいます。
4. Twitterから自サイトへリダイレクト
ログインに成功するか、認証の拒否をすると、$consumer->getRequestToken()の第二引数で指定したURLにリダイレクトされます。
認証に成功した場合、「$this->params['url']['oauth_token']」と「$this->params['url']['oauth_verifier']」に値が設定されます。
一方、認証を拒否した場合、「$this->params['url']['denied']」が設定されます。
$consumer=new OAuth_Consumer(取得したconsumer key,取得したconsumer secret); $requestToken=$this->Session->read('request_token'); $accessToken=$consumer->getAccessToken('http://twitter.com/oauth/access_token',$requestToken);
6. 取得したアクセストークンを使ってTwitterのAPIを実行
一度アクセストークンを取得してしまえば、そのアクセストークンを使って何度でもAPIを呼び出す事ができます。
// 自分のつぶやきを一つ取得 $tweet=$consumer->get($accessToken->key, $accessToken->secret, 'http://api.twitter.com/1/statuses/user_timeline.xml', array('count'=>1));
プログラム例
consumer keyとconsumer secretは自分で取得したものを使ってください。
<?php App::import('Vendor','oauth',array('file'=>'OAuth'.DS.'oauth_consumer.php')); class ExamplesController extends AppController { public $autoRender=FALSE; public $name='Examples'; public $uses=NULL; public function index() { $consumer=new OAuth_Consumer( 'XyPpN9KVd8xljAlafa00tsg', 'lLiQnseikjlajtrIJL3aosVRhLAKjl3jafRliLExFj0gOjlKjraebAu6z2p8'); // 認証後、「http://localhost/examples/exMain」にリダイレクトする $requestToken=$consumer->getRequestToken( 'http://twitter.com/oauth/request_token', 'http://localhost/examples/exMain'); // 認証後、アクセストークンを取得する際に必要なので保存 $this->Session->write('request_token',$requestToken); // Twitterの認証ページにリダイレクト $this->redirect('http://twitter.com/oauth/authorize?oauth_token=' .$requestToken->key); } // 認証後、このアクションが呼ばれる public function exMain() { // 認証を拒否したかどうか調べる if (isset($this->params['url']['denied'])) { echo 'access denied'; return; } $consumer=new OAuth_Consumer( 'XyPpN9KVd8xljAlafa00tsg', 'lLiQnseikjlajtrIJL3aosVRhLAKjl3jafRliLExFj0gOjlKjraebAu6z2p8'); $requestToken=$this->Session->read('request_token'); $accessToken=$consumer->getAccessToken( 'http://twitter.com/oauth/access_token', $requestToken); // 自分のつぶやきを一つ取得 $tweet=$consumer->get( $accessToken->key, $accessToken->secret, 'http://api.twitter.com/1/statuses/user_timeline.xml', array('count'=>1)); echo $tweet; } } ?>