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/ 以下のディレクトリに書き込み権限を与えてあげると解消します。

Javascriptメモ

Javascriptの変数でハマったことの備忘録です。

var hoge = "abc";
function fuga()
{
    alert(hoge); //出力A
    hoge = "def";
    alert(hoge); //出力B
}
fuga();

実行した出力結果は、Aが "abc" Bが "def"


しかし、下記のような書き方だと

var hoge = "abc";
function fuga()
{
    alert(hoge); //出力A
    var hoge = "def";
    alert(hoge); //出力B
}
fuga();

出力Aが undefined Bが "def" になる。

不思議だ。

女性もスマホを使ってみよう

最近女性にもスマートフォン利用者が増えているようなので、
女性向けスマホアプリを紹介しているサイトをまとめました。
アプリ探しの参考になるといいと思います。

アンドロイドール
“女の子視点”のアンドロイドアプリレビューサイト
http://androidoll.com/

スマホガール
女子で作る女子のためのAndroidレビューサイト
http://spgirl.jp/


android-girls
女性向けおすすめ人気アンドロイドアプリを掲載。女子必見!!
http://android-girls.com/

アメーバGG
http://prom.ameba.jp/amebagg-project/

ガールズアプリナビ
読者モデルが女の子目線でiphone/androidアプリを紹介する口コミレビューサイト
http://fashionistablogger.jp/g-applinavi/

InternetExplorer9でもマウスジェスチャーを使う方法

IE9でも使用可能なマウスジェスチャアドオンがありました。

Mouse Gestures for Internet Explorer
http://www.ysgyfarnog.co.uk/utilities/mousegestures/

インストール完了後は、
メニューバーから ツール → Mouse Gestures...
ジェスチャーの設定を行うことができます。

Windows環境でmemcachedを使ってみる

なんとなくWindows版memcacheネタを見かけたので触ってみたときのメモ

PHPでmemcacheを使うための方法です。
PECLでMemcacheを使用します。

PECL::Memcachedというのもあるみたいです。

■導入方法

以下サイトからmemcached実行ファイルをダウンロード
http://code.jellycan.com/memcached/
win32 binary: memcached-1.2.6-win32-bin.zip をダウンロード

展開してインストール

ファイルを設置
c:\memcached\memcached.exe

インストール
c:\memcached\memcached.exe -d install
Windows7環境では、コマンドプロンプトを管理者権限で実行しないと処理が失敗しました。)

サービス開始
c:\memcached\memcached.exe -d start
(サービスにmemcachedServerが登録されていると思います)

XAMPPの設定
下記ファイルをネットから探してダウンロード
php_memcache-cvs-20090703-5.3-VC6-x86.zip
(このバージョンだと動作しました。PHP5.3)

php.ini PECL の項目に下記を追加
extension=php_memcache.dll

Apache再起動

以上で完了です。

PHPマニュアルのサンプルコードで動作確認
http://php.net/manual/ja/book.memcache.php