我知道堆栈溢出上有大量关于"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>
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')
);
}
?>
我必须执行以下操作:
- 仅在第一页(即login/index)上使用PHP SDK的getLoginUrl,并将其从所有其他页面中删除。
- 从Javascript SDK中使用FB.getLoginStatus()并回退到FB.login()或重定向到登录/索引页面
- 检查FB.getLoginStatus() 在尝试任何可能需要有效access_token
我确信主要问题是我在每个页面上都调用了getLoginUrl。
由于我进行了这些更改,因此当机器人访问我的页面时,我只会在日志中收到"CSRF 状态令牌"错误。
尽管Facebook PHP API文档中没有说明,但您必须为PHP会话配置apache才能使登录过程正常工作。事实证明,这是我们在获得"CSRF 状态令牌与提供的令牌不匹配"时遇到的问题。
确保您使用的是服务器池,将其设置为使用 memcache 获取会话信息,否则 apache 将在本地写入会话信息,如果下一个请求没有转到同一服务器,您将获得"CSRF 状态令牌与提供的令牌不匹配"。
这是在开发环境(使用一台服务器)中像魅力一样工作但在生产中失败的事情之一。
我们还必须重新配置我们的CDN设置,以确保我们通过PHP会话cookie传递。
:
转到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