为什么getSessionFromRedirect()返回NULL?

SBe*_*Bel 15 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) . ']';

?>
Run Code Online (Sandbox Code Playgroud)

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

bhu*_*hya 23

这是因为getLoginUrl()函数,

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

然后isValidRedirect()getSessionFromRedirect()总是返回null

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

getLoginUrl()当facebook重定向到同一页面时不要打电话,只需添加正确的会话检查以检查有效的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;
}
Run Code Online (Sandbox Code Playgroud)

  • 简单来说,如果你使用相同的页面登录和redirect_uri,请不要在$ helper-> getSessionFromRedirect()之前调用$ helper-> getLoginUrl() (2认同)

Fos*_*sco 8

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

问题是,当您再次生成登录URL时,它会更改用于防止CSRF的"状态"变量.

  • @fosco我同意..但我只是帮助一些想要用单页实现逻辑的人..我没有看到任何人以这种方式发布答案..这有助于读者快速..所以我发布.. (2认同)

SBe*_*Bel 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>';

?>
Run Code Online (Sandbox Code Playgroud)

在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();
?>
Run Code Online (Sandbox Code Playgroud)

感谢Fosco的帮助.

  • 嗨,我和你有同样的问题,但我使用你的代码,我仍然从getSessionFromRedirect得到一个null.你有什么主意吗? (3认同)