5

我正在使用 facebook connect 使用他们的 facebook 帐户登录用户的应用程序中工作。

除以下情况外,一切正常:

  1. 用户从我的网站和 Facebook 注销。
  2. 用户尝试在我的应用程序中再次登录。

在这种情况下,当 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”。

可能是什么问题?

4

9 回答 9

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);
于 2011-01-23T20:07:51.390 回答
5

在当前版本的 Facebook SDK 中,您需要使用

$fb_key = 'fbsr_'.$facebookConfig['app_id'];
setcookie($fb_key, '', time()-3600);
$facebook->destroySession();

我尝试手动清除 cookie 和会话,但由于某种原因仍然无法正常工作(请参阅Facebook PHP:用户注销 facebook 后,他们无法与其他用户一起登录我的应用程序)。使用上述解决方案最终奏效了。

于 2012-04-04T10:39:15.370 回答
1

确保使用以下代码:

$params = array( 'next' => 'https://yourUrl/logout' );
        $data['logoutUrl'] = $this->facebook->getLogoutUrl($params);

将页面重定向到注销控制器或页面,然后终止该页面上的会话。

于 2012-09-09T17:26:25.263 回答
1

我遇到了同样的问题,我在网上提出的解决方案都没有为我工作。然后突然另一个具有相同代码的应用程序工作正常,所以我检查了应用程序中的高级设置,当我更改时它工作:OAuth 2.0 for Canvas ENABLED、Timezone-less events ENABLED 和 Upgrade to Requests 2.0 ENABLED

希望能帮助到你

于 2011-06-03T18:36:12.273 回答
0

我也遇到了这个问题,与 Efazati 的回答相反,我的问题在于 Facebook php api 库在我自己的域上设置的 cookie。我忽略的是在删除 cookie 时,使用设置 cookie 的确切域和路径。这是为我成功删除 cookie 的行。

setcookie("fbs_" . $app_id, '', time()-3600, "/", ".mydomain.com");

tgriesser 的评论也很有帮助。

于 2011-05-02T21:08:36.670 回答
0

正如你所说;) 这是关于你本地脚本设置的 cookie,而不是 Facebook.com 上的一个,所以你的问题是合法的。

我在这里遇到了同样的问题。PHPSDK 不允许您删除 cookie。所以要么你必须在没有cookie的情况下运行整个会话:

$facebook = new Facebook(array(
    'appId'  => FB_APPID,
    'secret' => FB_APPSECRET,
    'cookie' => false,
));

或者您将用户重定向到 facebook 上的注销 URL:

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>
于 2010-11-28T10:35:20.873 回答
0

由于某种原因,您无法删除 cookie,即使您显然有权读取它(因为您必须读取 access_token)。

但无论如何:这个问题只是出现在本地主机上。在您的服务器上,您不应该遇到问题!cookie 也不会在您的服务器上被删除,但当您再次尝试登录时,它不会被识别为有效的 access_token。

于 2011-01-23T19:00:14.820 回答
0

我遇到了同样的问题并尝试了以上所有方法,但后来我怀疑 cookie 名称不是我所期望的,而且确实如此!所以我只是打印了我的 cookie 并仔细检查我要删除哪些:

//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 脚本应该FB.logout在你的 js 部分调用之后运行:

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' });
    }
}
于 2011-12-14T08:31:08.380 回答
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

?>
于 2012-02-14T12:28:30.147 回答