TwitterKit Plugin は素晴らしすぎるのに使い方とか検索しても出てこないのでちょっと書いてみた。

名前の通り、Twitterに関するCakePHPのプラグインです。
Twitter API で出来ることは一通り出来るっぽい(全部試してないけど)

下記のリンク先にTwitterKitの作成者( @nojimage さん )が勉強会の発表用に作ったスライドの資料があります。
第2回CakePHP勉強会@福岡 LT発表資料
※この資料はCakePHP1.3です。

作成画面

環境

      CakePHP2.0.5
      PHP5.3.8

ダウンロード&設置方法

※CakePHP2.0が動作する前提です

下記からダウンロード。
https://github.com/elstc/twitter_kit/tree/2.0
(念のためにbranchが2.0になっていることを確認してください)

設定方法も書かれています。
Pluginなのでダウロードしたフォルダを app/Plugin 以下に展開したものを放り込むだけ。
今回名前は TwitterKit にしました。

テーブル作成

ユーザー情報を格納するテーブルを作成します。
SQLはこんな感じ。

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  `username` varchar(255) NOT NULL,
  `password` varchar(40) DEFAULT NULL,
  `oauth_token` varchar(128) DEFAULT NULL,
  `oauth_token_secret` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ;

設定

以下のファイルにTwitterと連携するための設定を記述します。
app/Config/database.php

var $twitter = array(
	'datasource' => 'TwitterKit.TwitterSource',
	'oauth_consumer_key'    => 'TwitterAPI登録時に取得したconsumer_key',
	'oauth_consumer_secret' => 'TwitterAPI登録時に取得したconsumer_secret',
	'oauth_callback'        => '/users/oauth_callback',  //TwitterAPI登録時に設定したcallback
);

CakePHP2.0からはPluginを使うためにはloadする必要があるので、以下のファイルにloadする旨を記述する。
app/Config/bootstrap.php

CakePlugin::load('TwitterKit');

AppController

ログイン認証用のテーブルとか先ほど作成したものを使いたいと思いますので、まずは AppController を作成する。
重要なのは beforeFilter の中。テーブルとか自分で作成したものをログイン用に使いたいと思うので、ここで指定する。
あとセッションキーも同じく指定する。

<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
	public $components = array( 'Session',  'Auth', 'TwitterKit.Twitter',);
	public $helpers = array( 'Session', 'Html', 'Form',);

	public function beforeFilter() {
		$this->Auth->userModel = 'User';
		$this->Auth->sessionKey = 'Auth.User';
		$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
		$this->Auth->loginRedirect = array('controller' => 'users', 'action' => 'index');
		$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
	}
}

UsersController

続いて UsersController を作成する。
以下のような感じになる。

1. index はログイン後に遷移してくるのでログイン後に表示したいものなのであればここに記述する。
2. twitter_login 画面のログインボタンが押下された際に呼ばれて、TwitterのAuthenticateにリダイレクトしている。
3. login は特に処理が必要無いのでこのまま。
4. logout はセッションの情報を削除している。
5. oauth_callback はTwitterの認証後に呼ばれるので、セッションの情報とユーザーテーブルに登録する情報をここで追加する。

<?php
App::uses('AppController', 'Controller');
class UsersController extends AppController {
    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('twitter_login', 'login', 'oauth_callback');
    }
    public function twitter_login() {
    	Configure::write('debug', 0);
    	$this->layout = 'ajax';
    	$this->Twitter->setTwitterSource('twitter');
    	pr($this->Twitter->getAuthenticateUrl(null, true));
    	$this->redirect($this->Twitter->getAuthenticateUrl(null, true));
    }
    public function login() {
    }
	public function logout() {
		$this->Session->destroy();
		$this->Session->setFlash(__('Signed out'));
		$this->Session->delete($this->Auth->sessionKey);
		$this->redirect($this->Auth->logoutRedirect);
	}
	public function index() {
		$this->User->recursive = 0;
		$this->set('users', $this->paginate());
	}

	function oauth_callback() {
		if (!$this->Twitter->isRequested()) {
			$this->flash(__('invalid access.'), '/', 5);
			return;
		}
		$this->Twitter->setTwitterSource('twitter');
		$token = $this->Twitter->getAccessToken();
		if (is_string($token)) {
			$this->flash(__('fail get access token.') . $token, '/', 5);
			return;
		}
		$data['User'] = array(
	        'id' => $token['user_id'],
			'username' => $token['screen_name'],
	        'password' => Security::hash($token['oauth_token']),
	        'oauth_token' => $token['oauth_token'],
	        'oauth_token_secret' => $token['oauth_token_secret'],
		);
		if (!$this->User->save($data)) {
			$this->flash(__('user not saved.'), 'login', 5);
			return;
		}
		$this->Auth->login($data);
		$this->redirect($this->Auth->loginRedirect);
	}
}

このUsersControllerに対するViewが必要なのは index と login だけ。

login.ctp

	<?php if (!$this->Session->check('Auth.User')) : /* 未ログインの場合 */ ?>
		<?php echo $this->Form->create('User',array('action'=>'twitter_login'));?>
		<?php echo $this->Form->end(__('Twitter で Login'));?>
	<?php else: ?>
		ログイン済みです。
		<?php $use = $this->Session->read('Auth.User'); ?>
		<strong><?php echo $this->Html->link(__('Logout'), array('action' => 'logout')); ?> </strong>
	<?php endif ; ?>

index.ctpは省略。特別なことはしてないので、一覧を表示しているだけです。

あとは、default.ctpにログアウトとか記述しておけばOK。
抜粋したものですが、こんな感じ。

		<div id="header">
			<h1>
			Twitterkitサンプル
			<?php if ($this->Session->check('Auth.User')) : ?>
				<?php $use = $this->Session->read('Auth.User'); ?>
				<ul style="float: right; list-style:none;">
					<li>
					<a href="">
						<img src="https://api.twitter.com/1/users/profile_image?screen_name=<?php echo $use['User']['username'];?>&size=mini" />
						<?php echo $this->Html->link(__('Logout'), array('action' => 'logout')); ?>
					</a>
					</li>
				</ul>
			<?php endif ; ?>
			</h1>
		</div>

ツィート取得等はDataSource使いますが、今回はここまで。
使い方が間違っていたらご指摘を頂けると幸いです。

authorizeとauthenticate
authorize
 毎回認証画面に連れて行かれる。

authenticate(今回はこっち)
 既にユーザーがアプリケーションを認証していて、Twitterにログインしている場合、アプリケーションのcallbackにリダイレクトされる。