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コンポーネントとかと連携するのは別の機会にやってみよう。