FB 登录错误 - CSRF 状态令牌与提供的令牌不匹配


fb login error - CSRF state token does not match one provided

我正在使用Facebook登录我的网站

从 https://github.com/facebook/facebook-php-sdk 下载了Facebook PHP SDK Source

对于Facebook登录,请按照 http://25labs.com/tutorial-integrate-facebook-connect-to-your-website-using-php-sdk-v-3-x-x-which-uses-graph-api/中给出的步骤进行操作

首先,它从不登录,只能在 2 次尝试后通过 Facebook 登录。每次我尝试登录时都会出现CSRF错误。

在进一步挖掘代码(base_facebook.php)时,了解到在第一次登录实例时:$this->state不等于$server_info['state'],因此CSRF错误。

试图找到解决此错误的方法,浏览各种帖子,但是没有成功。 请提出解决方案。 谢谢。

我也有这个问题。

在我的网站上,我还通过名称"state"设置了一个cookie和$_SESSION变量。 这导致了与Facebook类的冲突,因为FB类使用相同的键名。

以下是我对此问题的其他人的解决方案:

Facebook PHP SDK v3.2.3

要做的是将"状态"的某些实例替换为"fb_state"。

编辑(马库斯):我还用$_GET['state']交换了$_REQUEST['state']的所有实例。 这将强制应用程序从 URL 发布用户授权后获取"状态"值,因为 $_REQUEST 将拾取您可能已经拥有的任何存储的"状态"cookie。 就我而言,有一个。

例如 www.example.com/?code=AQA5cjNZ8iuZ...&状态=48A4A0A89ebb0c568f713fabebcd4899#=

由于我自己网站上的先前活动,我以前存储的"状态"cookie:ON

echo $_REQUEST['state']; // produces 'ON'
echo $_GET['state']; // produces 48a4a0a89ebb0c568f713fabebcd4899

在我的网站上。 而且我不会为了FB SDK而改变我的网站在服务器上存储cookie和会话变量的方法。

如果不将 $_REQUEST 更改为 $_GET,getCode() 函数将返回 false,因为:

if ($this->state === $_REQUEST['state']) {

不会解决。 在我的情况下,实际比较是 48a4a0a89ebb0c568f713fabebcd4899 与"ON"。

SRC/Facebook.php

public function __construct($config) {
    ...
    $state = $this->getPersistentData('state'); // line 67
    // change to
    $state = $this->getPersistentData('fb_state');
protected static $kSupportedKeys =
    array('fb_state', 'code', 'access_token', 'user_id'); // line 83

SRC/base_facebook.php

$state = $this->getPersistentData('fb_state'); // line 263
$this->clearPersistentData('fb_state'); // 730
$this->setPersistentData('fb_state', $this->state); // line 776

希望这对将来的某人有所帮助。

  • 马库斯