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

时间:2014-05-01 14:37:16

标签: 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\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创建了一个&#34;通过Facebook登录&#34;。但即使在用户单击登录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();

  }   

}
?>

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

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

它会更改状态变量。在您的原始问题中(在编辑它以包含您的修补程序之前),您在之前调用此方法验证原始代码中的响应,然后使CSRF检查无效,简而言之说用户没有&#39 ; t登录。我遇到了同样的问题,最好的办法是要么有一个单独的登录页面,就像你在这里做的那样。或者在完成对有效会话/ graphobject响应的所有检查后生成登录URL。

希望这可以帮助其他一些有同样问题的人,因为它让我烦恼了好几天,并没有真正记录下来,并且与以前的api有很大的不同。您需要查看SDK以查看正在进行的操作

答案 1 :(得分:2)

我自己也遇到过这个问题。您需要在脚本中使用session_start();启动会话才能使其正常工作。 See my short tutorial for more information

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