Facebook登录变得不稳定

时间:2013-11-01 17:23:16

标签: php facebook facebook-graph-api facebook-login

我几个月来一直在使用Facebook登录(PHP SDK)网站而没有任何问题。 几天以来,我们遇到了问题。

这是代码

    $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($ user为0和登录按钮)显示)。

过去几天,Facebook规则或浏览器是否有任何可以解释此行为的变化?我尝试使用firefox和chrome同样的结果。 由于我的PHP sdk已经有几个月了,我也尝试了最新的一个,结果相同。我也注意到在上一个版本的例子中,“base_url”不再被提及了,你知道为什么吗?

评论后编辑

在评论中提出一些提示之后,我试图调试正在发生的事情;似乎令牌不会变得无效;事实上,当我再次登录时,我仍然会在几小时前收到令牌。

出于某种原因,有时候用户被认为是NOT LOGGED(基本上$ facebook-> getUser()是假的),即使他是LOGGED。

其中一个原因,正如complex857所暗示的那样,可能是facebook在与我的网站交谈时遇到了问题;在最后几天我实际上注意到网站上的一般性能损失,并且在今天的调试会话之后,我可以说当涉及到facebook活动时会出现性能损失。 特别是我测量了这条指令的执行时间:

$fb_user_infos_ar = $facebook->api('/me');

大约5秒;我不知道它花了多长时间,但我想是太多了;你觉得怎么样?

关于可能的Cookie问题,我应该检查什么?

回答后编辑2

更多细节:如果API调用期间出现问题(catch部分)我曾经用

破坏facebook会话
$facebook->destroySession();

这就是用户注销的原因。有时实际上不需要销毁会话(例如,如果由于网络问题导致超时),那么我应该根据错误处理异常。

据我所知,Andy Jones提供的代码片段

echo "error code = " . $e->getCode() . " error = " . $e->getMessage() . "\n";

适用于CURL错误但不适用于其他类型的错误(例如令牌已过期)。例如,如果由于密码更改而令牌无效时我打印出异常,我得到:

  

FacebookApiException对象(       [结果:protected] =>排列           (               [错误] =>排列                   (                       [message] =>验证访问令牌时出错:会话已失效,因为用户已更改了   密码。                       [type] => OAuthException                       [code] => 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-> getCode()只给我0而不是190。

以下是错误列表:https://developers.facebook.com/docs/reference/api/errors/我认为在我的特定情况下处理流程的一种简单方法是:如果代码为190或102,则销毁facebook会话,否则尝试重复操作。您如何看待以及哪种代码能够以最佳方式处理此问题?

另一个问题:在使用$ e-> getMessage()记录异常的同时,我得到了 “验证访问令牌时出错:会话已失效,因为用户已更改密码。” 但我确信对于我当时使用的用户(我自己)我没有更改Facebook密码。怎么会发生这种情况?即使在其他情况下也会产生相同的消息(例如,当令牌处于其自然到期日期时)?

感谢。

1 个答案:

答案 0 :(得分:0)

有许多事情可能出错,你应该检查根本原因并采取适当行动......

} catch (FacebookApiException $e) {
  $facebook->destroySession();
  $user = null;
}

目前,您只是在破坏会话并继续前进。但是,例外有很多精彩的数据。从FacebookBase.php开始,您会在函数makeRequest中找到FacebookAPIException

$e = new FacebookApiException(array(
    'error_code' => curl_errno($ch),
    'error' => array(
    'message' => curl_error($ch),
    'type' => 'CurlException',
    )));
throw $e;

最重要的是,您要检查来自curl_errno的cURL错误代码和来自curl_error的人类可读消息。你可以这样做......

echo "error code = " . $e->getCode() . " error = " . $e->getMessage() . "\n";

Curl会告诉你explanation of the error code出了什么问题。对于一些更常见的错误,(6 =无解析主机,7 =无连接,28 =超时),这可能表示您的网络连接,Facebook或介于两者之间的某个问题。或者Facebook API可能只是忙碌而没有快速响应。最常见的反应就是再试一次。

如果您看到错误代码为0(零) - 没有错误 - 这意味着Facebook的通话工作正常,但Facebook根本没有返回任何数据。这是Facebook的错误。

如果您发现其他错误,请查看explanation of error codes,然后从那里开始。

Facebook Graph API不保证正常运行时间。您应该尽可能多地考虑缓存,并在出现错误时进行处理。我知道这对程序员来说更有用,但这是我们正在移动的互联世界。