我一直在使用Facebook登录(PHP SDK)为一个网站几个月没有问题。 几天以来,我们遇到了问题。Facebook登录已变得不稳定
下面是代码
$fbconfig['appid' ] = "...";
$fbconfig['secret'] = "...";
$fbconfig['baseurl'] = "myurl/index.php";
$facebook = new Facebook(array(
'appId' => $fbconfig['appid'],
'secret' => $fbconfig['secret'],
'cookie' => true,
));
$user = $facebook->getUser();
$loginUrl = $facebook->getLoginUrl(
array(
'scope' => 'email,user_likes,user_birthday',
'redirect_uri' => $fbconfig['baseurl']
)
);
$logoutUrl = $facebook->getLogoutUrl(
array(
'next' => $fbconfig['baseurl'].'?f=logout'
)
);
if ($user) {
....try {
$fb_user_infos_ar = $facebook->api('/me');
}
catch (FacebookApiException $e) {
$facebook->destroySession();
$user = null;
}
}
if (isset($fb_user_infos_ar)){
do something...
}
else{
show facebook login button
}
我们遇到的问题是,登录似乎工作,但经过一段时间(大部分时间甚至几秒钟后)后,用户不再为认可登录到Facebook($用户是0,登录按钮显示)。
在过去几天里,Facebook规则或浏览器可以解释这种行为吗?我已经尝试过使用firefox和chrome获得相同的结果。 由于我的PHP SDK是几个月前,我也尝试与最新的一个具有相同的结果。我还注意到,在最后的版本示例中,“base_url”不再提及,你知道为什么吗?
编辑后方可评论
后一些提示从评论的到来,我试图调试发生了什么;似乎令牌不会失效;事实上,当我再次登录时,我仍然会在几个小时之前生成一个令牌。
但是,由于某种原因,有时候用户被认为是NOT LOGGED(基本上$ facebook-> getUser()是false),即使他是LOGGED。
其中一个原因,正如complex857所暗示的,可能是Facebook在与我的网站交谈时遇到问题;在过去的几天里,我实际上注意到了网站的一般性能损失,今天进行了一次调试会话后,我可以说当涉及Facebook活动时,会出现性能损失。 特别是我测定该单个指令的执行时间:
$fb_user_infos_ar = $facebook->api('/me');
,它是约5秒;我不知道之前花了多少时间,但我猜想太多了;你怎么看?
关于可能的cookie问题,我应该检查什么?
后回答
更多细节编辑2:如果有我用来破坏与
$facebook->destroySession();
Facebook的会话API调用(扣部分)中的问题,这就是为什么用户登录出。有时它实际上不需要销毁会话(例如,如果由于网络问题而导致超时),所以我应该根据错误处理异常。
据我已经理解的,一段代码,安迪琼斯提供
echo "error code = " . $e->getCode() . " error = " . $e->getMessage() . "\n";
工作正常的卷曲错误,但不为其他种类的错误(例如,令牌过期)。例如,如果我打印出来的异常,当令牌是无效的,由于更改密码我得到:
FacebookApiException对象( [结果:保护] =>数组 ( [错误] =>数组 ( [信息] =>错误验证接入令牌:会话已经被无效,因为用户已经改变了 密码 [型] => OAuthException [代码] => 190 [error_subcode] => 460 )
。) [message:protected] => Error validating access token: The session has been invalidated because the user has changed the password. [string:Exception:private] => [code:protected] => 0 ....
$ E->引用代码()只给我0,而不是190
这里是错误列表:https://developers.facebook.com/docs/reference/api/errors/我认为,一个简单的方法来处理我的具体情况的过程中会:如果代码是190或102,则销毁Facebook会话,否则尝试重复该操作。你认为什么是最好的一段代码来处理这个问题的一般方式?
另一个问题:在使用$ e-> getMessage()记录异常时,我得到了 “验证访问令牌的错误:由于用户更改了密码,会话已失效。 但我确定对于我当时使用的用户(我自己的),我没有更改Facebook密码。这怎么会发生?即使在其他情况下也生成相同的消息(例如,当令牌处于自然失效日期时)?
谢谢。
尽量保存一个访问令牌,当其有效并提交给[调试工具](https://developers.facebook.com/tools/debug)时,它似乎变坏了。它讲述了什么? – complex857
它只是说 应用程序ID:myappid 并没有别的 – Eugenio
对不起,这是一个(我认为)已经到期的令牌。有了一个有效的,我得到 安比ID .. 用户ID ... 发行\t 1383249851(21小时前) 过期\t 1388433851(在约2个月) 有效\t真 产地\t网络 作用域\t电子邮件, read_stream,user_birthday,user_friends,user_likes,user_status – Eugenio