4

我知道 stackoverflow 上有大量关于“CSRF 状态令牌与提供的令牌不匹配”的问题。但是,我试过了,似乎并没有解决问题。你能看看我下面的代码吗?请告诉我您的想法以及如何解决问题。我已经更新到最新的 PHP SDK 版本。

<?
require_once ('src/facebook.php');
require_once ('src/fbconfig.php');

//Facebook Authentication part
$user_id = $facebook->getUser();
$loginUrl = $facebook->getLoginUrl(array(
    'scope' => 'publish_stream')
);

if ($user_id) {
    $_SESSION['user_id'] = $user_id;
    echo "<script>top.location.href = 'https://www.example.com/app-folder/welcome'</script>"; 
    exit;
} 
?>
    .
    .
<body>
<?php echo '<a href="'.$loginUrl.'" target="_top">Please login</a>'; ?>
    .
    .
</body>
4

4 回答 4

11

getLoginUrl()生成一个新的令牌。如果您的用户已经登录(使用$user_id = $facebook->getUser()),您最终将获得 2 个令牌。

如果用户已经通过身份验证,则不要询问 $loginUrl。

$user_id = $facebook->getUser();

if ($user_id) {
    $_SESSION['user_id'] = $user_id;
    echo "<script>top.location.href = 'https://www.example.com/app-folder/welcome'</script>"; 
    exit;
} else {
    $loginUrl = $facebook->getLoginUrl(array(
        'scope' => 'publish_stream')
    );
}

?>

于 2012-08-14T18:21:50.337 回答
0

我必须执行以下操作:

  1. 仅在第一页(即登录/索引)上使用PHP SDK 的 getLoginUrl并将其从所有其他页面中删除。
  2. 使用Javascript SDK 中的 FB.getLoginStatus() 并回退到 FB.login()或重定向到登录/索引页面
  3. 在尝试任何可能需要有效 access_token 的操作之前检查 FB.getLoginStatus()

我确信主要问题是我在每一页上都调用了getLoginUrl 。

由于我进行了这些更改,因此当机器人访问我的页面时,我只会在日志中收到“CSRF 状态令牌”错误。

于 2013-01-17T11:54:57.997 回答
0

尽管 Facebook PHP API 文档中没有说明,但您必须为 PHP 会话配置 apache 才能使登录过程正常工作。这就是我们在获得“CSRF 状态令牌与提供的令牌不匹配”时遇到的问题。

确保您使用的服务器池已设置为使用 memcache 获取会话信息,否则 apache 将在本地写入会话信息,如果下一个请求未发送到同一服务器,您将获得“CSRF 状态令牌与提供的令牌不匹配”。

这是在开发环境(使用一台服务器)中像魅力一样工作但在生产中失败的事情之一。

我们还必须重新配置我们的 CDN 设置以确保我们通过 PHP 会话 cookie。

于 2013-05-24T17:46:49.360 回答
-3

解决方法:
转到base_facebook.php

寻找protected function getCode()这就是问题所在。
$this->state变量不会为异地导航而保存(自然)

替换这个:

if ($this->state !== null &&
isset($_REQUEST['state']) &&
$this->state === $_REQUEST['state']) {

有了这个:

if ($_REQUEST['state'] != '' && $_REQUEST['code'] != '') {

它会很好地工作

G@bri3l

于 2013-03-11T13:09:44.273 回答