我正在使用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
答案 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
。
我希望这会有所帮助。