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


Facebook PHP SDK v4.0.0: $session is not set even after authorizing facebook from the login URL

UPDATE:现在问题已经解决。我所做的只是将这些代码放在一个不同的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();
  }   
}
?>

提前感谢!

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

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

它会更改状态变量。在你最初的问题中(在你编辑它以包含你的修复之前(,你在之前调用了这个方法你在原始代码中验证了响应,然后它使CSRF检查无效,简而言之,说用户没有登录。我遇到了完全相同的问题,最好的办法是像你在这里做的那样有一个单独的登录页面。或者在对有效会话/图形对象响应进行所有检查后生成登录url。

希望这能帮助其他一些有同样问题的人,因为它让我烦恼了好几天,而且没有真正的文档记录,与以前的api相比是一个很大的变化。您需要查看SDK以了解发生了什么

我自己也遇到过这个问题。您需要在脚本中使用session_start();启动会话才能使其正常工作。有关更多信息,请参阅我的简短教程。

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