Facebook PHP SDK v4.0.0:$session即使在从登录URL授权Facebook后也未设置

Facebook PHP SDK v4.0.0:$session即使在从登录URL授权Facebook后也未设置,php,facebook,facebook-graph-api,facebook-php-sdk,Php,Facebook,Facebook Graph Api,Facebook Php Sdk,更新:问题现在解决了。我所做的就是将此代码放入一个不同的php文件中: <?php Function __autoload($classname) { $filename = "./".$classname .".php"; require_once($filename); } use Facebook\FacebookSession; use Facebook\FacebookRequest; use Facebook\GraphUser; use Facebook\F

更新:问题现在解决了。我所做的就是将此代码放入一个不同的php文件中:

<?php
Function __autoload($classname) {
    $filename = "./".$classname .".php";
    require_once($filename);
}

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;

session_start();

FacebookSession::setDefaultApplication('257772307761170','***');

$helper = new FacebookRedirectLoginHelper('http://localhost/parqueeste/login.php');
try {
  $session = $helper->getSessionFromRedirect();
} catch(FacebookRequestException $ex) {
  // When Facebook returns an error
} catch(\Exception $ex) {
  // When validation fails or other local issues
}
if ($session) {
  echo 'Yeah!!';
}
?>

原始消息:我正在使用Facebook SDK v4.0.0 for PHP创建“通过Facebook登录”。但是,即使在用户单击登录URL之后,$session变量也没有定义,因此我无法访问用户的数据。这是我的密码:

<?php
session_start();
function __autoload($classname) {
    $filename = "./".$classname .".php";
    require_once($filename);
}

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;

FacebookSession::setDefaultApplication('257772307761170','****'); //I have the right
app secret on my code, of course.

$helper = new FacebookRedirectLoginHelper('http://localhost/parqueeste/');
$loginUrl = $helper->getLoginUrl();


if(isset($session) AND $session) { // <--- I use isset() so I don't
get a warning everytime I load my site

  try {

    $user_profile = (new FacebookRequest(
      $session, 'GET', '/me'
    ))->execute()->getGraphObject(GraphUser::className());

    echo "Name: " . $user_profile->getName();

  } catch(FacebookRequestException $e) {

    echo "Exception occured, code: " . $e->getCode();
    echo " with message: " . $e->getMessage();

  }   

}
?>

我自己也经历过这个问题。您需要使用
session_start()启动会话以使其正常工作


将它添加到脚本的顶部,我是在
use
语句之后做的。

这里的实际问题是,当调用getLoginUrl()方法时,例如

 $helper = new FacebookRedirectLoginHelper('http://localhost/parqueeste/');
 $loginUrl = $helper->getLoginUrl();
它会更改状态变量。在原始问题中(在编辑该问题以包含修复程序之前),在验证原始代码中的响应之前调用了此方法,然后它会使CSRF检查无效,简言之,表示用户尚未登录。我遇到了完全相同的问题,最好的办法是要么像这里一样有一个单独的登录页面。或者,在完成有效会话/graphobject响应的所有检查后生成登录url


希望这能帮助其他一些有同样问题的人,因为它困扰了我好几天,并且没有真正的文档化,这是对以前的api的一个很大的改变。您需要查看SDK以了解发生了什么

从技术上讲,您还将
start\u session()
方法移动到了我说的要移动它的位置。很高兴您能够解决它。谢谢您的回答!我会投赞成票,但我不能。@Niraj Shah你的文章真是天赐之物!!非常感谢。希望我能早点看到你的博客。