CakePHP2.0+FacebookSDKを利用した認証

twitterのoauthを利用したログイン認証はよく見かけるので、今回はfacebookで認証してみる

1.facebook SDKのダウンロード

https://github.com/facebook/php-sdk からダウンロード

2.CakePHP内への設置

1.でダウンロードしたファイルを解凍し、/src以下のファイルのみ/app/Vendor配下に設置(ここではsrcフォルダをfacebookSdkにリネームした)

3.Facebook用コンポーネントの作成

/app/Controller/Component配下に、FacebookComponent.phpを作成。以下の内容を記述

App::import('Vendor', 'facebookSdk',array('file' => 'facebookSdk' . DS . 'facebook.php'));

class FacebookComponent extends Component {

private static $facebookInstance;
private $loginUrl = null;

public function __construct() {
$config = array();
$config['appId'] = FACEBOOK_APPLICATION_KEY;
$config['secret'] = FACEBOOK_SECRET_KEY;
$config['fileUpload'] = false; // optional

$this->facebookInstance = new Facebook($config);
}

/**
*
*/
public function getRequestToken() {
return $this->facebookInstance->getUser();
}

/**
*
*/
public function getAccessToken() {
return $this->facebookInstance->getAccessToken();
}

/**
*
*/
public function getLoginUrl() {
$params = array('display'=>'popup',
'redirect_uri'=> 'http://' . $_SERVER['HTTP_HOST'] . '/account/callback/facebook/',
// 'scope'=>'${カンマ区切りでのパーミッション}',
);
return $this->facebookInstance->getLoginUrl($params);
}

/**
*
*/
public function getLogoutUrl() {
$params = array('next' => 'http://' . $_SERVER['HTTP_HOST'] . '/');
return $this->facebookInstance->getLogoutUrl($params);
}

}

4.Controller側の設定

今回ログイン周りのコントローラーはAccountController、ユーザー管理用モデルはUserAccountとした。

class AccountController extends AppController {
public $uses = array('UserAccount');

/**
* ログイン
*
*/
public function login() {
$requestToken = $this->Facebook->getRequestToken();
if ($requestToken) {
throw new UnauthorizedException();
}
$this->redirect($this->Facebook->getLoginUrl());
}
}

/**
* ログイン成功時コールバック
*
*/
public function callback() {
$this->layout = '';
$data = array();

$accessToken = $this->Facebook->getAccessToken();
$data['request_token_facebook'] = $accessToken;

if ($accessToken) {
$registedResult = $this->UserAccount->find('first',array('conditions' => array(key($data) => $data[key($data)])));
if (!$registedResult) {
if (!$this->UserAccount->save($data)) {
throw new MissingDatabaseException();
}
}
$this->Session->write(CUCMBER_AUTH, $accessToken);
}
}

/**
* ログアウト
*
*/
public function logout() {
$this->Session->destroy();
$this->redirect($this->Facebook->getLoginUrl());
}
}

Authコンポーネントとかと連携するのは別の機会にやってみよう。