CakePHPでOAuth

Twitter等で使われているOAuthをCakePHPで使うライブラリを紹介します。


OAuth consumers for CakePHP - by cakebaker

導入方法

  1. OAuth consumer classをダウンロード
  2. CakePHPのルートディレクトリか、appディレクトリで展開する(それぞれ「vendors/OAuth」か「app/vendors/OAuth」に展開される)

使い方

Twitterを例にして説明します。Twitter以外のサービスを利用する場合も基本的には同じです。
大まかな流れは次の様になります。


・事前準備
Webサービスの立ち上げ前に、Twitterからconsumer keyとconsumer secretをあらかじめ取得しておく


・認証とAPI利用の流れ

  1. Twitterからリクエストークンを取得
  2. Twitterの認証ページへリダイレクト
  3. ユーザにログインしてもらう
  4. ログイン後、あらかじめ設定しておいた自サイトのURLにTwitterがリダイレクトしてくれる
  5. Twitterからアクセストークンを取得
  6. 取得したアクセストークンを使ってTwitterAPIを実行


それでは具体的に説明して行きます。

事前準備

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'));


2. Twitterからリクエストークンを取得

$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']」が設定されます。


5. Twitterからアクセストークンを取得

$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. 取得したアクセストークンを使ってTwitterAPIを実行
一度アクセストークンを取得してしまえば、そのアクセストークンを使って何度でも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;
  }
}
?>