我在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之前,它们很可能没有被清除,这就是为什么它仍然认为你有连接,但在刷新时工作良好的原因。
我最终做的是:
$facebook->getLogoutUrl(array('next' => site_url('logout')));
- 然后在"注销"控制器中:
$_SESSION = array();
$this->load->view('myoriginalview');
注销时,facebook注销url的查询字符串redirect_uri值被设置为重定向到"注销"控制器,然后该控制器清除会话并加载最初存在注销按钮的视图。一切正常。现在我只需要弄清楚如何处理过期的会话,而不是注销的用户-_-
编辑:
我现在所做的是以脸书开发者论坛上描述的正确方式使cookie无效。我真的希望他们的文档更好,并为他们的PHP SDK描述了这一点。