2013-11-01 30 views
0

我一直在使用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密码。这怎么会发生?即使在其他情况下也生成相同的消息(例如,当令牌处于自然失效日期时)?

谢谢。

+2

尽量保存一个访问令牌,当其有效并提交给[调试工具](https://developers.facebook.com/tools/debug)时,它似乎变坏了。它讲述了什么? – complex857

+0

它只是说 应用程序ID:myappid 并没有别的 – Eugenio

+0

对不起,这是一个(我认为)已经到期的令牌。有了一个有效的,我得到 安比ID .. 用户ID ... 发行\t 1383249851(21小时前) 过期\t 1388433851(在约2个月) 有效\t真 产地\t网络 作用域\t电子邮件, read_stream,user_birthday,user_friends,user_likes,user_status – Eugenio

回答

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_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不保证正常运行。您应该尽可能考虑缓存,并在出现错误时处理。我知道这对程序员来说是更多的工作,但是这是我们正在移动的互联世界。

+0

感谢您的回答;有一个错误日志程序,但由于某种原因它在几天前被删除;无论如何,我接受了你的答案,因为它给了我正确的方向,不过,我仍然对此有所怀疑,所以我再次编辑了这个问题,提供了更多细节。 – Eugenio