2014-08-29 132 views
1

我正在使用SDK v.4,但类FacebookRedirectLoginHelper方法isValidRedirect出现问题。Facebook isValidRedirect总是返回false

的SDK的代码是

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

虽然$_GET['state']是在回调URL的参数和$this->state由它产生的密码安全pseudrandom号码的功能random()分配。

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

应该检查$ _SESSION不是$ _GET

回答

1

其实,如果你在代码仔细一看,该loadState()功能实际上看起来在$_SESSION并将其装入$this->state状态。之后调用isValidRedirect(),这意味着它使用$_SESSION加载state

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

+0

请问你能解释一下你的答案吗?如何避免以上情况发生?即$ _GET ['state']&$ this->状态不匹配。 – 2015-03-10 09:52:32

+0

当facebook返回到我的网址时,它再次调用getLoginUrl()函数。 所以我的问题是,是否有条件像if($ _ SESSION ['FBRLH_state'] ==''),然后只调用函数getLoginUrl()? – 2015-03-10 12:01:39

+1

'getLoginUrl()'函数不会进行API调用,因此它在代码中再次被调用应该没有关系。更好的做法是寻找'$ _GET ['code']',因为这将是Facebook在登录时返回的内容。看看我的例子:https://www.webniraj。com/2014/05/01/facebook-api-php-sdk-updated-to-v4-0-0/ – 2015-03-11 11:53:06

0

我也有类似的问题,我只是修复它。

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

getLoginUrl()会产生一个新的'状态',所以我只在第一阶段叫getLoginUrl()

阶段1: 我显示了一个页面,链接由getLoginUrl()生成。 在这里我得到了一个状态,说的值是X.

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

第3阶段: 用户被重定向回我的网站,以“国家”,和值为X.

如果我叫getLoginUrl()在这里,一个新的“国家”,将会产生 因此isValidRedirect()将始终返回false。

所以我检查isset($_GET['state'])第一, 不叫getLoginUrl()isset($_GET['state'])TRUE

我希望这会有所帮助。

+0

我知道这是这种情况,并编写我的应用程序来避免这个问题,但我仍然得到它。我已经为storeState函数添加了一个var_dump,这样我就可以知道它何时更新会话值。它会运行一次以按预期生成url,并且当我从Facebook返回时它不会运行一次,但会话值和获取值由于某种原因而不匹配。我已经花了数小时的时间在这方面,我看不到这是怎么回事。 – 2014-11-14 00:24:27