Facebook SDK PHP erreur d'exception
Je suis un intéressant SDK message de l'exception de FB du SDK PHP. J'ai mis mon code exactement comme le FB docs disent de faire..?
DEBUG MESSAGE D'ERREUR:
[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("**********","*******************");
Page D'Ouverture De Session:
<?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( '***********' );
Lien sur la page d'ouverture de session:
<a href="<?php echo $helper->getLoginUrl();?>"><img src="<?php echo BASE_URL; ?>img/facebook-login-button.png" class="fb-login"></a>
Url de redirection de page:
<?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
}
Mettre
session_start();
en haut de chaque fichier...
OriginalL'auteur Ryan Salmons | 2014-06-12
Vous devez vous connecter pour publier un commentaire.
Mettre
session_start();
sur le HAUT de votre fichierOriginalL'auteur Chancho
Pour développer Chancho réponse, le SDK va vérifier pour voir si une session est active avant qu'il tente de stocker toutes les données. Il y a 3 façons de contourner cela.
Commencer un natif de session PHP
Si vous êtes juste en utilisant PHP natif de séances, Chancho réponse suffit. Vous devez vous assurer que
session_start();
est tout en haut de votre script avant toute sortie est envoyé.Remplacer le gestionnaire de session
Si vous utilisez un framework web comme Codeigniter, Yii, CakePHP, Laravel, etc, ils ont généralement leurs propres moyens de stockage d'une session. Pour remplacer la valeur par défaut de la session de magasin, vous aurez besoin d'écrire votre propre classe qui étend la
\Facebook\FacebookRedirectLoginHelper
classe. Ensuite, vous aurez besoin de remplacer lastoreState()
etloadState()
méthodes. Ce sont les deux seules méthodes dans l'ensemble du SDK à l'interface avec les$_SESSION
variable.Vous pouvez voir un laravel exemple de mise en œuvre dans le GitHub questions pour le SDK. Voici la laravel mise en œuvre:
Désactiver la session de vérifier complètement
Si vous essayez d'utiliser le SDK dans un environnement sans état comme la ligne de commande, il n'y a pas de point de départ à une session ou à l'écrasement de la façon dont les données de session sont stockées. Vous pouvez tout simplement désactiver la case à
FacebookRedirectLoginHelper::disableSessionStatusCheck()
.Pour désactiver la session vérifier il suffit d'exécuter cette.
J'espère que ça aide!
Il semble que cela ne fonctionne plus avec le nouveau SDK. Toutes les pensées?
OriginalL'auteur SammyK
Pour l'utilisation de CakePHP v3.1.6 + Facebook SDK v4.1.
Dans le nouveau SDK, \Facebook\FacebookRedirectLoginHelper classe a été modifiée pour utiliser \Facebook\FacebookSessionPersistentDataHandler classe permettant de gérer la session "état". Mettre $this->request->session()->start() dans AppController initialiser permettra de résoudre le problème à l'aide de Facebook SDK avec AuthComponent.
OriginalL'auteur horizon1711