为什么getSessionFromRedirect()返回NULL?

时间:2014-05-07 19:28:31

标签: facebook-php-sdk

我有以下代码重定向用户登录到facebook并尝试检索会话但会话为NULL:

<?php

session_start();

require 'vendor/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;

FacebookSession::setDefaultApplication('Foo', 'Bar');

$helper = new FacebookRedirectLoginHelper('Baz');
$loginUrl = $helper->getLoginUrl();  

echo '<a href="' . $loginUrl . '">Log In</a>';  

$session = $helper->getSessionFromRedirect();  

// This displays [NULL] always
echo '[' . gettype($session) . ']';

?>

我不明白为什么$ session总是为NULL。请帮忙。

8 个答案:

答案 0 :(得分:23)

  

这是因为getLoginUrl()函数,

     

因为当我们提到与FB重定向页面相同的页面时,它会一次又一次地调用getLoginUrl()函数..哪个更改$this->state变量值

     

然后isValidRedirect()getSessionFromRedirect()始终返回null

以下是与FB重定向页面使用相同页面的解决方案:

当Facebook将您重定向到同一页面时,请不要致电getLoginUrl(),只需添加正确的会话检查以检查有效的facebook会话(请参阅以下代码示例)

session_start();
require("facebook/autoload.php");


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

FacebookSession::setDefaultApplication('appid84', '0secret0a626c6');

$helper = new FacebookRedirectLoginHelper('http://tmd.local/fblogin.php');

try {
  $session = $helper->getSessionFromRedirect();
  // var_dump($session);
} catch(FacebookRequestException $ex) {
} catch(\Exception $ex) {
}
if ($session) {
  var_dump($session);
}
else
{
  $loginUrl = $helper->getLoginUrl();
  header("location:".$loginUrl);
  exit;
}

答案 1 :(得分:8)

您应该只在Facebook登录后重定向用户的页面上调用getSessionFromRedirect。然后将该会话存储在某个地方,例如$ _SESSION,并在其他地方重新使用它。

问题是,当您再次生成登录URL时,它会更改用于防范CSRF的“状态”变量。

答案 2 :(得分:5)

好的,所以目标是获得FacebookSession。需要有2个页面:1个用于显示“登录”链接,另一个用于接受FacebookSession的实例。在page1.php中:

<?php

session_start();

require 'vendor/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;

FacebookSession::setDefaultApplication('foo', 'bar');

$helper = new FacebookRedirectLoginHelper('page2.php');
$loginUrl = $helper->getLoginUrl();

echo '<a href="' . $loginUrl . '">Log In</a>';

?>

在page2.php中:

<?php

session_start();

require 'vendor/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;

FacebookSession::setDefaultApplication('foo', 'bar');

$helper = new FacebookRedirectLoginHelper('page2.php');

// Now you have the session
$session = $helper->getSessionFromRedirect();
?>

感谢Fosco的帮助。

答案 3 :(得分:1)

如果需要,您可以从单页进行会话加载,登录重定向和API调用。 This tutorial shows you how it can be done

答案 4 :(得分:1)

我在完成上述所有操作时遇到了同样的问题,我通过

修复了它
  

更改应用程序设置。 Facebook开发者 - &gt;我的应用 - &gt;设置 - &gt;高级 - &gt;有效的OAuth重定向URI - &gt;在目录末尾添加“/”。如果是文件,则结束文件所在目录的路径。

答案 5 :(得分:0)

答案 6 :(得分:0)

FacebookRedirectLoginHelper.php第214行有一个错误!

用这种方式用$ _SESSION ['state']更改$ _GET ['state']:

  /**
   * Check if a redirect has a valid state.
   *
   * @return bool
   */
  protected function isValidRedirect()
  {
    $savedState = $this->loadState();
    if (!$this->getCode() || !isset($_GET['state'])) {
      return false;
    }
    $givenState = $_GET['state'];
    $savedLen = mb_strlen($savedState);
    $givenLen = mb_strlen($givenState);
    if ($savedLen !== $givenLen) {
      return false;
    }
    $result = 0;
    for ($i = 0; $i < $savedLen; $i++) {
      $result |= ord($savedState[$i]) ^ ord($givenState[$i]);
    }
    return $result === 0;
  }

到此:

 /**
   * Check if a redirect has a valid state.
   *
   * @return bool
   */
  protected function isValidRedirect()
  {
    $savedState = $this->loadState();
    if (!$this->getCode() || !isset($_SESSION['state'])) {
      return false;
    }
    $givenState = $_SESSION['state'];
    $savedLen = mb_strlen($savedState);
    $givenLen = mb_strlen($givenState);
    if ($savedLen !== $givenLen) {
      return false;
    }
    $result = 0;
    for ($i = 0; $i < $savedLen; $i++) {
      $result |= ord($savedState[$i]) ^ ord($givenState[$i]);
    }
    return $result === 0;
  }

答案 7 :(得分:-1)

对我来说真正不同的是我正在使用的重定向Url地址。 因斜线而导致的时间和小时数。

用例子解释:

(错误)

$helper = new FacebookRedirectLoginHelper('http://www.example.com');

(右)

$helper = new FacebookRedirectLoginHelper('http://www.example.com/');

我在Stackoverflow上阅读了大量的教程和答案,这个最后的斜线是真正的答案。我希望它有助于某人