所以我之前发布了一个上一个问题,但删除了它,因为我发现了我的问题。
基本上,我收到了这个错误:
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);
开始,我仍然得到了同样奇怪的值)
答案 0 :(得分:0)
最奇怪的解决方案,当我删除</head>
(基本上我让<head>
未公开)时,问题就解决了