【问题标题】:Delete facebook session cookie from my application on users logout在用户注销时从我的应用程序中删除 facebook 会话 cookie
【发布时间】:2011-05-15 00:43:32
【问题描述】:

我正在使用 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”。

可能是什么问题?

【问题讨论】:

  • 我不想从 facebook.com 删除 cookie。使用 facebook connect 时,api 会在我的域中创建一个 cookie。似乎本地主机有问题。我已经把网站上线了,它工作了。
  • 你为什么接受Efazati的回答!我不认为这是正确的。我实际上认为您上面的评论是正确的答案:这是一个问题,只是出现在本地主机上!请不要接受错误的答案,只是为了提高您的接受率!!!

标签: php facebook cookies logout


【解决方案1】:

我很确定我也遇到了这个问题...您需要确保在删除 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);

【讨论】:

  • .sfConfig::get('app_facebook_application_id') 返回什么?是否与您的FB_APPID 的值相同?
  • 是的......它基本上是在回应使用交响乐框架的问题语法......但我不确定所有这些是否仍然适用于当前的sdk,因为他们已经自发布此答案以来进行了一些更改
  • 嗨 tgriesser,你知道如何正确使用 access_token 注销吗?我刚刚尝试了默认代码developers.facebook.com/docs/reference/php/facebook-api,但是当我注销 FB 时,我的应用程序仍然认为我已登录,当我以其他用户身份登录时也是如此。有什么建议吗?
【解决方案2】:

在当前版本的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)。使用上述解决方案最终奏效了。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我在网上提出的解决方案都没有为我工作。然后突然另一个具有相同代码的应用程序工作正常,所以我检查了应用程序中的高级设置,当我更改时它工作: 适用于 Canvas 的 OAuth 2.0 已启用, 启用无时区事件和 升级到 Requests 2.0 已启用

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      确保使用以下代码:

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

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

      【讨论】:

        【解决方案5】:

        正如你所说 ;) 这是关于你的本地脚本设置的 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>
        

        【讨论】:

        • 问题是$facebook-&gt;getLogoutUrl();函数没有正确清除会话数据,而不是用户在此过程中退出Facebook。
        • 这就是为什么在代码中有一个array('next'=&gt;URL_AFTER_LOGOUT))。 URL_AFTER_LOGOUT 中的脚本有它自己的会话破坏机制对我来说是合乎逻辑的。
        【解决方案6】:

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

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

        tgriesser 的评论也很有帮助。

        【讨论】:

        • 我遇到了这个问题。出于某种原因,setcookie($facebook-&gt;getSignedRequestCookieName(), '', time() - 3600); 不起作用,而 setcookie($facebook-&gt;getSignedRequestCookieName(), '', time() - 3600, '/'); 确实起作用了。
        【解决方案7】:
        <?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
        
        ?>
        

        【讨论】:

        • 会一直注销成功,握手后删除会话ID,SDK无法继续会话。
        【解决方案8】:

        我遇到了同样的问题并尝试了以上所有方法,但后来我怀疑 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 脚本应该在你的 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' });
            }
        }
        

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            猜你喜欢
            • 2011-12-14
            • 2015-12-26
            • 2019-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-24
            • 2013-10-26
            相关资源
            最近更新 更多