Я получаю интересное сообщение об исключении 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 }
Поместите session_start();
в верхней части вашего файла
Чтобы расширить ответ Chancho, SDK проверит, активен ли сеанс, прежде чем он попытается сохранить в нем какие-либо данные. Есть три способа обойти это.
Если вы просто используете собственные сессии 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'] ]); }