我正在使用facebook connect的应用程序中使用他们的Facebook帐户登录用户。
除以下情况外,一切正常:
在这种情况下,当facebook连接弹出窗口打开时显示“应用程序中的错误”。
我发现原因是用户注销时没有删除旧的fbs cookie。 我已添加代码以在我的应用程序注销时删除cookie,但cookie不会被删除。
这是我的代码(使用Symfony框架。)
$fbCookie = 'fbs_'.sfConfig::get('app_facebook_application_id');
$cookie = $request->getCookie($fbCookie);
if(!is_null($cookie)){
setCookie($fbCookie," ", time()-3600);
}
这不起作用。 cookie保持不变。 setCookie函数按预期返回“1”。
可能是什么问题?
答案 0 :(得分:9)
我很确定我也遇到了麻烦......你需要确保在删除cookie之后立即杀死Facebook会话,否则它会弹回来......这是一个例子
// Assuming that $facebook is your facebook object populated with your settings
$facebook = new Facebook(array(
'appId' => FB_APPID,
'secret' => FB_APPSECRET,
'cookie' => true));
$fb_key = 'fbs_'.sfConfig::get('app_facebook_application_id');
set_cookie($fb_key, '', '', '', '/', '');
$facebook->setSession(NULL);
答案 1 :(得分:5)
在当前版本的Facebook SDK中,您需要使用
$fb_key = 'fbsr_'.$facebookConfig['app_id'];
setcookie($fb_key, '', time()-3600);
$facebook->destroySession();
我尝试手动清除Cookie和会话,但由于某些原因它仍然无效(请参阅Facebook PHP: After user logs out of facebook, they can't login to my app with another user)。使用上述解决方案最终起了作用。
答案 2 :(得分:1)
我遇到了同样的问题,我在网上找到的解决方案都没有为我工作。然后突然另一个具有相同代码的应用程序工作正常,所以我检查了应用程序中的高级设置,当我更改时它工作: 用于Canvas的OAuth 2.0已启用, 无时区的事件得以实现 升级到Requests 2.0 ENABLED
希望有所帮助
答案 3 :(得分:1)
请务必使用以下代码:
$params = array( 'next' => 'https://yourUrl/logout' );
$data['logoutUrl'] = $this->facebook->getLogoutUrl($params);
将页面重定向到注销控制器或页面,然后终止该页面上的会话。
答案 4 :(得分:0)
正如你所说;)它是关于你的本地脚本设置的cookie,而不是Facebook.com上的cookie,所以你的问题是合法的。
我在这里遇到同样的问题。 PHPSDK不允许您删除cookie。所以要么你必须在没有cookie的情况下运行整个会话:
$facebook = new Facebook(array(
'appId' => FB_APPID,
'secret' => FB_APPSECRET,
'cookie' => false,
));
或者您将用户重定向到facebook的注销网址:
header('Location: ' . $facebook->getLogoutUrl(array('next'=>URL_AFTER_LOGOUT))');
唯一的问题似乎是用户也从Facebook注销了。
如果你可以使用Javascript试试这个:
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
FB.init({appId: '<?php echo FB_APPID;?>', status: true, cookie: true, xfbml: true});
FB.Event.subscribe('auth.logout', function(response) {
window.location.href='YOUR_LOCAL_LOGOUTSCRIPT';
});
</script>
答案 5 :(得分:0)
出于某种原因,你无法删除cookie,即使你显然有权阅读它(因为你必须阅读access_token)。
但无论如何:这个问题刚出现在localhost上。在您的服务器上,您不应该遇到问题! cookie也不会在您的服务器上被删除,但是当您尝试再次登录时,它不会被识别为有效的access_token。
答案 6 :(得分:0)
我也遇到了麻烦,与Efazati的回答相反,我的麻烦在于我的Facebook php api库在我自己的域上设置了cookie。我忽略的是删除cookie,使用cookie设置的确切域和路径。这是为我成功删除cookie的行。
setcookie("fbs_" . $app_id, '', time()-3600, "/", ".mydomain.com");
tgriesser的评论也很有用。
答案 7 :(得分:0)
我有同样的问题,并尝试了以上所有,但后来我怀疑饼干的名字不是我期待它们的确如此!所以我只是打印我的饼干并仔细检查我要删除哪些:
//print the cookies just to make sure what is the exact name of the cookie
foreach ($_COOKIE as $key => $value) {
print $key . "=" . $value . "</br>";
}
//delete
if (isset($_COOKIE['fbsr_' . $app_id])) {
setcookie('fbsr_' . $app_id, $_COOKIE['fbsr_' . $app_id], time() - 3600, "/");
setcookie('PHPSESSID', $_COOKIE['PHPSESSID'], time() - 3600, "/");
unset($_COOKIE['fbsr_' . $app_id]);
unset($_COOKIE['PHPSESSID']);
}
这个php脚本应该在你的js部分中调用FB.logout
之后运行:
function logout() {
FB.init({appId: '[your app id]', status: true, cookie: true,xfbml: true});
var flag = confirm("logout from your facebook account as well");
if (flag) {
FB.logout(function(response) { window.location='logout.php' });
}
}
答案 8 :(得分:0)
<?php
// include the Facebook SDK
include_once 'src/facebook.php';
// Define crutial perams
define( 'APPID', '' );
define( 'SECRET', '' );
define( 'URL', 'http://fb.domain.co.uk' );
// shake my hand!
$facebook = new Facebook( array( 'appId' => APPID, 'secret' => SECRET, 'fileUpload' => true ) );
// if we are being visited by someone trying to logout, lets me sure they get logged out!
if( isset( $_GET['logged_out'] ) ) {
setcookie( "PHPSESSID", "", (time()-3600) );
header( "location: " . URL );
exit();
}
// lets try to get the users id
$user_id = $facebook->getUser();
// try to get their access token
$access_token = $facebook->getAccessToken();
// if we have an id
if($user_id) {
// from the offset, we're good to go...
$logged_in = true;
echo "<h1>Logged in</h1>";
$params = array( 'next' => URL . '?logged_out' );
$return .= '<br /><a href="' . $facebook->getLogoutUrl($params) . '">logout</a>';
}else{
// login man!
$login_url = $facebook->getLoginUrl(
array(
'scope' => 'read_stream, publish_stream, manage_pages, photo_upload',
'next' => URL . '?logged_in'
)
);
$return .= 'Please <a href="' . $login_url . '">login.</a>';
}
echo $return
?>