Facebook Graph API注销时出现OAuthException,刷新后有效


OAuthException on Facebook Graph API Logout, Works After Refresh

我在CodeIgniter框架内的github.com/facebook上使用一个修改后的php-sdk 3.0.0版本示例代码作为助手。

我的问题正如标题所说:当我点击注销锚点(由$Facebook->getLogoutUrl()提供)时,我会被重定向回同一页面,并收到OAuthException:

Fatal error: Uncaught OAuthException: Error validating access token: The session is invalid because the user logged out. thrown in [...]/base_facebook.php on line 959

当我刷新时,它会像正常情况一样加载"登录"锚。刷新/回发上发生了什么,而初始重定向上没有发生什么?

我意识到这是有限的信息,但由于问题,我认为这可能是一个简单的解决方案。

编辑:这篇文章似乎很相关:http://forum.developers.facebook.net/viewtopic.php?id=71219

特别是这一行:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');

然而,我不确定如何实现这一点,并且仍然使用$facebook->getLogoutUrl();

提前谢谢,如果需要更多信息,请告诉我。

我也遇到了同样的问题,差点把头发拔出来。然而,经过一些研究,问题似乎是一个令人反感的cookie。注销时的这一行应该可以修复它:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');

请确保添加"。"如果正在使用子域,则在域名之前。

我希望这能有所帮助!

按照建议,我尝试了:

setcookie('fbs_'.$facebook->getAppId(), '', time()-100, '/', '.domain.com');

这没用。我所做的只是从联邦调查局复制示例代码:

// Get User ID
$user = $facebook->getUser();
// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($user) {
    try {
        // Proceed knowing you have a logged in user who's authenticated.
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
    }
}
// Login or logout url will be needed depending on current user state.
if ($user) {
    $logoutUrl = $facebook->getLogoutUrl();
} else {
    $loginUrl = $facebook->getLoginUrl();
}

中间部分,如果尝试获取user_profile,则是获取用户配置文件的测试,如果失败,则将取消设置userid。这将使getLoginUrl()和getLogoutUrl()的最后一部分正确。

我确实相信设置cookie比尝试请求并查看它是否失败更正确。。。但由于setcookie不起作用,我别无选择:(

愚蠢的facebook在用户实际注销时返回一个带有$user = $facebook->getUser();的令牌。

希望这能帮助那些需要帮助的人。

从您的错误来看,您的网站似乎仍在尝试使用SDK连接到Facebook。当你运行Facebook提供的注销功能时,请确保清除触发对Facebook调用的任何会话或存储。

在你尝试注销Facebook之前,它们很可能没有被清除,这就是为什么它仍然认为你有连接,但在刷新时工作良好的原因。

我最终做的是:

  1. $facebook->getLogoutUrl(array('next' => site_url('logout')));
  2. 然后在"注销"控制器中:
    $_SESSION = array();
    $this->load->view('myoriginalview');

注销时,facebook注销url的查询字符串redirect_uri值被设置为重定向到"注销"控制器,然后该控制器清除会话并加载最初存在注销按钮的视图。一切正常。现在我只需要弄清楚如何处理过期的会话,而不是注销的用户-_-

编辑:
我现在所做的是以脸书开发者论坛上描述的正确方式使cookie无效。我真的希望他们的文档更好,并为他们的PHP SDK描述了这一点。