class Example extends CI_Controller { function __construct() { parent::__construct(); } function index() { $this->load->library('facebooklib'); $user = $this->facebooklib->getUser(); if ($user) { try { $data['user_profile'] = $this->facebooklib->api('/me'); } catch (FacebookApiException $e) { $user = null; } } var_dump($_REQUEST); if ($user) { $data['logout_url'] = $this->facebooklib->getLogoutUrl(); } else { $data['login_url'] = $this->facebooklib->getLoginUrl(); } $this->load->view('view',$data); } }
После того, как вы нажмете ссылку «Вход», я перейду на страницу разрешений на Facebook, я принимаю, и я вернусь на ту же страницу без данных.
array(3) { ["/example"]=> string(0) "" ["PHPSESSID"]=> string(32) "33a446883d4fb1877fb6dcff6d70799a" ["ci_session"]=> string(311) "a:4:{s:10:"session_id";s:32:"d8bb3926550e3ec1b9d075b456708e9b";s:10:"ip_address";s:9:"127.0.0.1";s:10:"user_agent";s:120:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19";s:13:"last_activity";i:1336011855;}c874fb95984396f04ab6cc17217102d7" }
Мой дамп $ _REQUEST на самом деле не показывает signed_request, что является проблемой.
Несмотря на все downvotes, я смог найти решение этого ОЧЕНЬ серьезного BUG, найденного в Facebook PHP-SDK с CodeIgniter.
Итак, вот решение, найденное на форумах CI: http://codeigniter.com/forums/viewthread/202370/#986781
// Stop cache $this->ci->output->set_header("Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); $this->ci->output->set_header("Pragma: no-cache"); // IE Fix if(strpos($this->ci->agent->agent_string(), 'MSIE') !== FALSE) { $this->ci->output->set_header('p3p: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'); } // Repopulate _REQUEST ... Facebook needs it. $request_uri = $_SERVER['REQUEST_URI']; $request_uri = explode('?',$request_uri); if(count($request_uri) > 1) { parse_str($request_uri[1], $_REQUEST); }
По какой-то причине новый PHP SDK не передает $ _REQUEST через CodeIgniter. Также есть проблемы с кешем, а IE не имеет надлежащего заголовка.
Таким образом, это создает $ _REQUEST из $ _SERVER ['REQUEST_URI'], который затем правильно проходит через класс Facebook и успешно возвращает правильные данные.
Используйте эту инструкцию, это может помочь
$signed_request = isset($_REQUEST['signed_request']) ? $_REQUEST['signed_request'] : $this->modelfacebook->signRequest();
Согласно одному из ответов в этом сообщении , CodeIgniter очищает переменную $ _REQUEST по соображениям безопасности. Я предполагаю, что это связано с автоматической фильтрацией входных сигналов, описанной в Руководстве Codeigniter здесь , но в нем конкретно не упоминается. Я не уверен, что установка
$config['global_xss_filtering'] = TRUE;
в config.php влияет на это или нет (я установил значение TRUE в моем), но по крайней мере теперь вы / знаем, почему переменная $ _REQUEST недоступна.
Интересно, что у меня есть библиотека FB SDK в моей папке CIApplication / libraries / и кажется, что доступ к переменной $ _REQUEST прекрасен, просто не в моих представлениях или контроллерах.
Я искал ответ на тот же вопрос, когда столкнулся с этим сообщением, – и ваш вопрос – это совершенно правильный, хороший вопрос!
Приветствия Мэтта