2015-09-25 44 views
1

因此,我在此之前发布了一个前面的问题,但因为发现我的问题而将其删除。Facebook API会话内容随机更改

基本上,我得到这个错误:

Facebook SDK returned an error: Cross-site request forgery validation failed. The "state" param from the URL and session do not match.

我能够确定,对于一些奇怪的原因,我的$_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.cookiePHPSESSID

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

有人可以帮助我在这个非常令人沮丧的问题?任何人都知道可能会发生什么?

编辑:另外,我创建了一个空白的文件,只是

session_start(); 
print_r($_SESSION); 

,值我得到总是比赛login-callback.php这意味着login.php必须改变一些会话值(但....我可以“T弄清楚如何,因为当我print_r($_SESSION);在文件的底部,我仍然得到同样的怪异值)

回答

0

最古怪的解决方案,问题是,当我删除了</head>(基本上我让解决<head>是未封闭)

+0

这听起来不像是一个真正的“解决方案”,而是对代码的另一个问题的隐式修复。 – CBroe