Facebook isValidRedirect总是返回false

时间:2014-08-29 00:05:01

标签: facebook facebook-sdk-4.0

我正在使用SDK v.4,但类似FacebookRedirectLoginHelper方法isValidRedirect似乎有问题。

SDK代码

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

虽然$_GET['state']是回调网址中的参数,$this->state由函数random()分配,而{{1}}生成加密安全的伪随机数。

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

应该检查$ _SESSION而不是$ _GET

2 个答案:

答案 0 :(得分:1)

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

使用Facebook登录后,您还可以看到URL中存在$_GET['state'],因此此检查有效。如果不是,则永远不会将代码交换为access_token

答案 1 :(得分:0)

我也有类似的问题,我刚修好了。

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

getLoginUrl()会生成一个新状态,因此我只会在第一阶段调用getLoginUrl()

第1阶段: 我显示了一个页面,其中包含getLoginUrl()生成的链接。 我在这里得到一个州,比如说价值是X.

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

第3阶段: 用户被重定向回我的网站,状态为',值为X.

如果我在这里打电话给getLoginUrl(),那就是新的状态'将生成, 因此isValidRedirect()将始终返回false。

所以我先检查isset($_GET['state'])getLoginUrl()isset($_GET['state'])时,请勿致电TRUE

我希望这会有所帮助。