Ошибка PHP PHP SDK

Я получаю интересное сообщение об исключении SDK из PHP SDK FB. Я настроил свой код точно так, как говорят FB docs.

СООБЩЕНИЕ ОШИБКИ DEBUG:

[12-Jun-2014 21:08:12 UTC] PHP Fatal error: Uncaught exception 'Facebook\FacebookSDKException' with message 'Session not active, could not store state.' in C:\WebRoot\Website\root\inc\Facebook\FacebookRedirectLoginHelper.php:188 Stack trace: #0 C:\WebRoot\Website\root\inc\Facebook\FacebookRedirectLoginHelper.php(94):Facebook\FacebookRedirectLoginHelper->storeState('**********...') #1 C:\WebRoot\Website\root\login\index.php(87): Facebook\FacebookRedirectLoginHelper->getLoginUrl() #2 {main} thrown in C:\WebRoot\Website\root\inc\Facebook\FacebookRedirectLoginHelper.php on line 188 

Facebook.php:

 <?php require_once("../inc/config.php"); require_once(ROOT_PATH . 'inc/Facebook/FacebookSession.php' ); require_once(ROOT_PATH . 'inc/Facebook/FacebookRedirectLoginHelper.php' ); require_once(ROOT_PATH . 'inc/Facebook/FacebookRequest.php' ); require_once(ROOT_PATH . 'inc/Facebook/FacebookResponse.php' ); require_once(ROOT_PATH . 'inc/Facebook/FacebookSDKException.php' ); require_once(ROOT_PATH . 'inc/Facebook/FacebookRequestException.php' ); require_once(ROOT_PATH . 'inc/Facebook/FacebookAuthorizationException.php' ); require_once(ROOT_PATH . 'inc/Facebook/GraphObject.php' ); require_once(ROOT_PATH . 'inc/Facebook/HttpClients/FacebookCurl.php' ); require_once(ROOT_PATH . 'inc/Facebook/HttpClients/FacebookHttpable.php' ); require_once(ROOT_PATH . 'inc/Facebook/HttpClients/FacebookCurlHttpClient.php' ); use Facebook\FacebookSession; // init app with app id (APPID) and secret (SECRET) FacebookSession::setDefaultApplication("**********","*******************"); 

Главная страница входа:

 <?php require_once("../inc/config.php"); require_once(ROOT_PATH . 'inc/Facebook/Facebook.php' ); require_once(ROOT_PATH . "inc/LoginHelper.php"); use Facebook\FacebookSession; use Facebook\FacebookRedirectLoginHelper; use Facebook\FacebookRequest; use Facebook\FacebookResponse; use Facebook\FacebookSDKException; use Facebook\FacebookRequestException; use Facebook\FacebookAuthorizationException; use Facebook\GraphObject; use Facebook\HttpClients\FacebookCurl; use Facebook\HttpClients\FacebookHttpable; use Facebook\HttpClients\FacebookCurlHttpClient; session_start(); // login helper with redirect_uri $helper = new FacebookRedirectLoginHelper( '***********' ); 

Ссылка на главную страницу входа:

 <a href="<?php echo $helper->getLoginUrl();?>"><img src="<?php echo BASE_URL; ?>img/facebook-login-button.png" class="fb-login"></a> 

Перенаправить страницу URL:

 <?php require_once("../inc/config.php"); require_once(ROOT_PATH . 'inc/Facebook/Facebook.php' ); use Facebook\FacebookSession; use Facebook\FacebookRedirectLoginHelper; use Facebook\FacebookRequest; use Facebook\FacebookResponse; use Facebook\FacebookSDKException; use Facebook\FacebookRequestException; use Facebook\FacebookAuthorizationException; use Facebook\GraphObject; use Facebook\HttpClients\FacebookCurl; use Facebook\HttpClients\FacebookHttpable; use Facebook\HttpClients\FacebookCurlHttpClient; session_start(); //get user login token from FB $helper = new FacebookRedirectLoginHelper('*******'); try { $session = $helper->getSessionFromRedirect(); } catch(FacebookRequestException $ex) { echo $ex; // When Facebook returns an error } catch(Exception $ex) { echo $ex; // When validation fails or other local issues } if ($session) { $FacebookAccessToken = $session->getToken(); // Logged in } 

Solutions Collecting From Web of "Ошибка PHP PHP SDK"

Поместите session_start(); в верхней части вашего файла

Чтобы расширить ответ Chancho, SDK проверит, активен ли сеанс, прежде чем он попытается сохранить в нем какие-либо данные. Есть три способа обойти это.

Начать собственную сессию PHP

Если вы просто используете собственные сессии PHP, ответа Chancho будет достаточно. Вы должны убедиться, что session_start(); находится на самом верху вашего скрипта перед отправкой любого вывода.

Перезаписать сеансовую обработку

Если вы используете веб-структуру, такую ​​как Codeigniter, Yii, CakePHP, Laravel и т. Д., У них обычно есть собственные способы хранения сеанса. Чтобы перезаписать хранилище сеансов по умолчанию, вам нужно написать свой собственный класс, который расширяет класс \Facebook\FacebookRedirectLoginHelper . Затем вам нужно будет перезаписать storeState() и loadState() . Это всего лишь два метода во всем SDK, которые взаимодействуют с переменной $_SESSION .

Вы можете увидеть пример реализации laravel в проблемах GitHub для SDK. Вот реализация laravel:

 class MyFacebookRedirectLoginHelper extends \Facebook\FacebookRedirectLoginHelper { protected function storeState($state) { Session::put('state', $state); } protected function loadState() { return $this->state = Session::get('state'); } } 

Полностью отключить проверку сеанса

Если вы пытаетесь использовать SDK в среде без состояния, такой как командная строка, нет смысла запускать сеанс или перезаписывать, как хранятся данные сеанса. Вы можете просто отключить проверку с помощью FacebookRedirectLoginHelper::disableSessionStatusCheck() .

Чтобы отключить проверку сеанса, просто запустите это.

 $helper = new FacebookRedirectLoginHelper('*******'); $helper->disableSessionStatusCheck(); $session = $helper->getSessionFromRedirect(); // . . . 

Надеюсь, это поможет!

Для использования CakePHP v3.1.6 + Facebook SDK v4.1.

В новом SDK класс \ Facebook \ FacebookRedirectLoginHelper был изменен для использования класса \ Facebook \ FacebookSessionPersistentDataHandler для обработки состояния сеанса. Ввод $ this-> request-> session () -> start () в инициализации AppController устранит проблему, используя Facebook SDK с AuthComponent.

 public function initialize() { parent::initialize(); $this->request->session()->start(); $this->loadComponent('RequestHandler'); $this->loadComponent('Flash'); $this->loadComponent('Auth', [ 'authenticate' => [ 'Form' => [ 'fields' => ['username' => 'email', 'password' => 'password'] ] ], 'loginAction' => ['controller' => 'Users', 'action' => 'login'] ]); }