CakePHPでFacebookSDKを使いながらSession(セッション)DBを実装する

DSC00797

2014年04月15日(火)

とてもはまったのですが、要は、CakePHPでSessionをdatabase参照にする場合にこのFacebookSDKを使用した場合にものすごく注意が必要ですよということです。

ちなみに僕は9時間ぐらいはまりました。最初から「ここだ!」と気付いていれば早かったんですが色々考えてしまいましたよ。

 

まぁ結論以下の記事の対応でいけます。

http://blog.mogya.com/2013/04/cakephpnofacebook.html

 

要するにだな、CakePHPのフレームワークを使っているならフレームワークのコーディングで書けということですわ。

$_SESSIONとかstart_sessionとか使っているから参照がdatabaseではなく普通にファイル参照に切り替わっていたんだ。

 

まじで大変な思いをしたので気を付けよう。。。。

 

<?php
require_once "base_facebook.php";
 
/**
 * Extends the BaseFacebook class with the intent of using
 * PHP sessions to store user ids and access tokens.
 */
class CakeFacebook extends BaseFacebook
{
 /**
 * Identical to the parent constructor, except that
 * we start a CakePHP session to store the user ID and
 * access token if during the course of execution
 * we discover them.
 *
 * @param Array $config the application configuration. 
 * "sharedSession" is not supported.
 * @see BaseFacebook::__construct in facebook.php
 */
 public function __construct($config) {
 if (!CakeSession::started()) {
 CakeSession::start();
 }
 parent::__construct($config);
 }
 
 protected static $kSupportedKeys =
 array('state', 'code', 'access_token', 'user_id');
 
 /**
 * Provides the implementations of the inherited abstract
 * methods. The implementation uses CakePHP CakeSession.
 */
 protected function setPersistentData($key, $value) {
 if (!in_array($key, self::$kSupportedKeys)) {
 self::errorLog('Unsupported key passed to setPersistentData.');
 return;
 }
 
 $session_var_name = $this->constructSessionVariableName($key);
 CakeSession::write($session_var_name,$value);
 }
 
 protected function getPersistentData($key, $default = false) {
 if (!in_array($key, self::$kSupportedKeys)) {
 self::errorLog('Unsupported key passed to getPersistentData.');
 return $default;
 }
 
 $session_var_name = $this->constructSessionVariableName($key);
 return CakeSession::check($session_var_name) ?
 CakeSession::read($session_var_name) : $default;
 }
 
 protected function clearPersistentData($key) {
 if (!in_array($key, self::$kSupportedKeys)) {
 self::errorLog('Unsupported key passed to clearPersistentData.');
 return;
 }
 
 $session_var_name = $this->constructSessionVariableName($key);
 CakeSession::delete($session_var_name);
 }
 
 protected function clearAllPersistentData() {
 foreach (self::$kSupportedKeys as $key) {
 $this->clearPersistentData($key);
 }
 }
 
 protected function constructSessionVariableName($key) {
 $parts = array('fb', $this->getAppId(), $key);
 return implode('_', $parts);
 }
}

 

facebook.phpと同じディレクトリに配置して・・・
と書いているが、該当ファイルをこれで上書きしても使える。

 

 

スポンサードリンク

運営サービスPR

スポンサードリンク

運営サービスPR