0

我在我的网站上使用 facebook 登录

从https://github.com/facebook/facebook-php-sdk下载 facebook php sdk 源

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

在第一种情况下,它永远不会登录,只能在 2 次尝试后通过 facebook 登录。每次我尝试登录时都会出现 CSRF 错误。

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

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

4

1 回答 1

1

我也有这个问题。

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

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

脸书 PHP SDK v3.2.3

要做的是用 'fb_state' 替换某些 'state' 实例。

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

例如 www.example.com/?code=AQA5cjNZ8iuZ...& state =48a4a0a89ebb0c568f713fabebcd4899# =

由于之前在我自己的网站上的活动,我之前存储的“状态”cookie:开

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

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

  • 马库斯
于 2013-12-22T06:38:45.753 回答