1

我正在开发 SDK v.4,但 Class FacebookRedirectLoginHelper 方法 isValidRedirect 似乎有问题。

SDK代码是

 protected function isValidRedirect()
  {
    return $this->getCode() && isset($_GET['state'])
        && $_GET['state'] == $this->state;
  }

While$_GET['state']是回调 URL 中的参数,由生成加密安全伪随机数$this->state的函数分配。random()

$_GET['state'] 和 $this->state; 永远不会返回真实!

应该检查 $_SESSION 而不是 $_GET

4

2 回答 2

1

实际上,如果您仔细查看代码,该loadState()函数实际上会在 中查找状态$_SESSION并将其加载到$this->state. isValidRedirect()之后调用,这意味着它使用加载$_SESSIONstate.

用Facebook登录后也可以看到$_GET['state']URL中存在,所以这个检查是有效的。如果不是,代码将永远不会被交换为access_token.

于 2014-08-29T09:43:26.180 回答
0

我也有类似的问题,我刚刚解决了。

重点是关于“状态”变量。

getLoginUrl()将生成一个新的“状态”,所以我只getLoginUrl()在第一阶段调用。

第 1 阶段:我显示一个页面,其中包含由getLoginUrl(). 这里我得到了一个状态,说值是 X。

第 2 阶段:用户点击链接,然后被重定向到 Facebook Oath 对话框,用户将在其中输入他们的 Facebook 名称和密码,并允许应用访问用户的公共信息。

第 3 阶段:用户被重定向回我的网站,带有“状态”,值为 X。

如果我getLoginUrl()在这里调用,将生成一个新的“状态”,因此 isValidRedirect() 将始终返回 false。

所以我先检查isset($_GET['state']),不要打电话getLoginUrl()when isset($_GET['state'])is TRUE

我希望这有帮助。

于 2014-11-07T21:11:57.283 回答