Facebook API会话内容随机变化

时间:2015-09-25 22:55:45

标签: php facebook session

所以我之前发布了一个上一个问题,但删除了它,因为我发现了我的问题。

基本上,我收到了这个错误:

Facebook SDK返回错误:跨站点请求伪造验证失败。 "州" URL和会话中的参数不匹配。

我能够找出一些奇怪的原因,我的$_SESSION['FBRLH_state']正在发生变化。以下是为用户生成登录网址的login.php

session_start();
}
require_once $_SERVER['DOCUMENT_ROOT'] . '/src/Facebook/autoload.php';
$fb = new Facebook\Facebook ([
    'app_id' => '??????',
    'app_secret' => '????',
    'default_graph_version' => 'v2.4'
    ]);
$helper = $fb->getRedirectLoginHelper();
$loginUrl = $helper->getLoginUrl('http://example.ca/login-callback.php');
echo '<a href="' . $loginUrl . '">Login</a>';
print_r($_SESSION);

当我做print_r($_SESSION);时,我明白了:

Array ( [FBRLH_state] => d116b427b433a0b3dc41a858782cd690 )

然而(为魔法做好准备),在重定向到login-callback.php文件时,$_SESSION数组神秘地改变了这一点:

Array ( [FBRLH_state] => e99c4ece0f8e48ab53dea6a4826c5593 )

以下是login-callback.php

的代码
<?php
header("Content-type: text/html;charset=utf-8");
session_start();
print_r($_SESSION);
require_once $_SERVER['DOCUMENT_ROOT'] . '/src/Facebook/autoload.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/Database.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/User.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/vars/constants.php';

//Create the Facebook service
$fb = new Facebook\Facebook ([
    'app_id' => '????',
    'app_secret' => '????',
    'default_graph_version' => 'v2.4'
    ]);

$helper = $fb->getRedirectLoginHelper();
try {
    $accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
}

if (isset($accessToken)) {
    $mysqli = Database::connection();

    // Logged in!
    $_SESSION['facebook_access_token'] = (string) $accessToken;

当我打印$_SESSION时(我在headers之后做的第一件事),我得到了与login.php完全不同的值。这没有任何意义,因为他们都在同一个域(非www)并且他们有相同的document.cookie PHPSESSID

,有一个问题。如果我按回login-callback.php(因为login.php重定向到它,然后由于这个奇怪的会话魔法导致登录失败),$_SESSION值神秘地匹配。如果我刷新,不会工作,仅当我按下时。我认为这是一些重要的线索,但是我不知道该怎么回事。

有人可以帮我解决这个非常令人沮丧的问题吗?谁知道可能会发生什么?

编辑:另外,我创建了一个只有

的空白文件
session_start();
print_r($_SESSION);

我得到的值始终匹配login-callback.php,这意味着login.php必须更改某些会话值(但......我无法弄清楚从文件底部的print_r($_SESSION);开始,我仍然得到了同样奇怪的值)

1 个答案:

答案 0 :(得分:0)

最奇怪的解决方案,当我删除</head>(基本上我让<head>未公开)时,问题就解决了