CakePHP2.0系+TwitterAPIでログイン処理を作成

CakePHP2.0系を最近使い始めたので、CakePHP+TwitterOAuth認証について紹介します。

使用したもの
CakePHP2.0.4
OAuth consumers for CakePHP - by cakebaker
Bootstrap, from Twitter

CakePHPフレームワークを設置
初期設定については省略

OAuthライブラリを設置
app/Vendor/Oauth/ に設置
2.0系はディレクトリ名の先頭が大文字なので注意

OAuthライブラリの修正
Vendor/OAuth/oauth_consumer.php

App::import('Core', 'http_socket');

App::uses('HttpSocket', 'Network/Http');

APIキーを記述
キーについては各自で取得
Twitter Developers

app/Config/bootstrap.php

define('TWITTER_CONSUMER_KEY', '取得したCONSUMER KEY');
define('TWITTER_CONSUMER_SECRET', '取得したCONSUMER SECRET');


コントローラの作成

AppController
/app/Controller/AppController.php

<?php
class AppController extends Controller 
{
    public $helpers = array('Html', 'Js' => array('common'), 'Session');
    public $components = array('Session');
    
    protected $is_login = false;
    
    public function beforeFilter()
    {
        $this->is_login = $this->isLogin();
        if ($this->is_login) {
            $token = $this->getToken();
            $consumer = $this->createConsumer();
            $profile = json_decode($consumer->get($token->key, $token->secret, 'https://api.twitter.com/1/account/verify_credentials.json'));
            $this->set('profile', $profile);
        }
        $this->set('is_login', $this->is_login);
        return parent::beforeFilter();
    }
    
    public function isLogin()
    {
        $token = $this->getToken();
        if ($token->key && $token->secret) {
            return true;
        }
        return false;
    }
    
    public function getToken()
    {
        $token = new stdClass;
        $token->key = $this->Session->read('Twitter.accessToken.key');
        $token->secret = $this->Session->read('Twitter.accessToken.secret');
        return $token;
    }
    
    protected function createConsumer()
    {
        return new OAuth_Consumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET);
    }
}
?>

TopController
/app/Controller/TopController.php

<?php
App::import('Vendor','oauth', array('file'=>'OAuth'.DS.'oauth_consumer.php'));
class TopController extends AppController
{
    public $uses = array();
    /**
     * トップ
     */
    public function index()
    {
        $consumer = $this->createConsumer();
        if ($this->is_login) {
            $token = $this->getToken();
        }
    }
    
    /**
     * サインイン
     */
    public function sign_in()
    {
        $consumer = $this->createConsumer();
        $request_token = $consumer->getRequestToken('https://api.twitter.com/oauth/request_token', 'http://xxxxxxxxxx/top/twitter_callback/');
        $this->Session->write('twitter_request_token', $request_token);
        
        //セッションを保持していない場合はTwitter認証へ
        if(!$this->Session->read('Twitter.accessToken.key')){ 
            $this->redirect('https://api.twitter.com/oauth/authorize?oauth_token=' . $request_token->key);  
        } else {  
            //認証済みフラグを渡してリダイレクト
            $this->redirect('http://xxxxxxxxxx/top/twitter_callback/1/');  
        } 
    }
    
    /**
     * コールバックAPI
     * @param $logged_in ログインフラグ
     */
    public function twitter_callback($logged_in = 0)
    {
        $consumer = $this->createConsumer();
        if ($logged_in == 0) {
            $request_token = $this->Session->read('twitter_request_token');
            $access_token = $consumer->getAccessToken('https://api.twitter.com/oauth/access_token', $request_token);
            $this->Session->write('Twitter.accessToken.key', $access_token->key);
            $this->Session->write('Twitter.accessToken.secret', $access_token->secret);
        } else {
            $access_token->key = $this->Session->read('Twitter.accessToken.key');
            $access_token->secret = $this->Session->read('Twitter.accessToken.secret');
        }
        //トップページへ
        $this->redirect('http://xxxxxxxxxx/top/');  
    }
}
?>

Twitter Bootstrapを使用してビューを作成
展開したディレクトリ内にあるjs/を
app/webroot/js に、

bootstrap.css
app/webroot/css に設置

レイアウトを作成する


その他
Warning: _cake_core_ cache was unable to write 'cake_dev_ja' to File cache in / ~~
と上部に表示される場合
app/tmp/ 以下のディレクトリに書き込み権限を与えてあげると解消します。