如何从 facebook 应用程序注销用户,但保持从 facebook 登录

Posted

技术标签:

【中文标题】如何从 facebook 应用程序注销用户,但保持从 facebook 登录【英文标题】:How to log out user from facebook application, but maintain login from facebook 【发布时间】:2012-04-04 17:45:38 【问题描述】:

我已经尝试过 php SDK (v.3.1.1) 和当前的 javascript SDK 在这里建议:https://developers.facebook.com/docs/guides/web/

现在,当我尝试注销时,我已经尝试了 FB.logout() (对于 js ) 和 $facebook->getLogoutUrl() ;

正如两者的文档中明确指出的那样,这些方法 将用户从应用程序以及他们的 facebook 会话中注销。

但我只需要将用户从 facebook 应用程序(测试站点)中注销即可。

我已尝试将用户从我的测试站点中注销,而忽略了 facebook 方面。但是在这种情况下,当用户再次点击登录按钮时, 登录流程(facebook 身份验证和重定向)不会发生。

我也试过了:(正如之前未解决的问题所建议的那样)

$facebook->destroySession();

unset($_SESSION['fb_' . sfConfig::get('app_fb_config_id') . '_code']);
unset($_SESSION['fb_' . sfConfig::get('app_fb_config_id') . '_access_token']);
unset($_SESSION['fb_' . sfConfig::get('app_fb_config_id') . '_user_id']);    

然而,当重定向到登录页面时,$facebook->getUser() 仍然 检索用户。

注意: 根据文档示例,我正在使用 php sdk 将用户登录到我的测试站点, 和 js sdk,用于渲染和促进 facebook 登录按钮。

补充:

我使用的身份验证基本上是文档建议的:

<?php

define('YOUR_APP_ID', 'YOUR APP ID');

//uses the PHP SDK.  Download from https://github.com/facebook/php-sdk
require 'facebook.php';

$facebook = new Facebook(array(
  'appId'  => YOUR_APP_ID,
  'secret' => 'YOUR APP SECRET',
));

$userId = $facebook->getUser();

?>

<html>
  <body>
    <?php if ($userId)  
      $userInfo = $facebook->api('/' + $userId); ?>
      Welcome <?= $userInfo['name'] ?>
    <?php  else  ?>
    <div id="fb-root"></div>
    <fb:login-button></fb:login-button>
    <?php  ?>
    <script>
      window.fbAsyncInit = function() 
        FB.init(
          appId      : '<?= YOUR_APP_ID ?>',
          status     : true, 
          cookie     : true,
          xfbml      : true,
          oauth      : true,
        );

        FB.Event.subscribe('auth.login', function(response) 
          window.location.reload();
        );
      ;

      (function(d)
         var js, id = 'facebook-jssdk'; if (d.getElementById(id)) return;
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js";
         d.getElementsByTagName('head')[0].appendChild(js);
       (document));
    </script>
  </body>
</html>

【问题讨论】:

如果用户通过您的应用程序的身份验证并登录到 facebook,getUser() 将始终返回 FBID。删除 cookie 有效,但 sdk 获得一个新的 access_token wenn 调用 getUser 问题是你为什么要这样做?您(应用程序)和 facebook 用户都不会从中获得任何收益。 简单地删除您为该用户拥有的会话 cookie 怎么样?如果您只删除 cookie,那么用户仍将保持登录 facebook,但不会登录您的应用程序。下次用户单击登录按钮时,您会为他创建一个新会话。 @NitzanTomer 我尝试删除测试站点的会话,但正如我所说,在这种情况下,js sdk 的登录按钮不再按预期工作。 @Rufinus,不知道你在这里想说什么“你为什么要这样做?” .基本上,我只希望用户退出网站,并在用户退出时消除 facebook 关联。但是,如果用户决定再次登录,我希望整个登录过程的行为就像以前没有发生过登录一样。 这是一个不同的问题,您能出示您的 facebook 身份验证代码吗? 【参考方案1】:

获取您的代码,并稍作修改:

<?php
    define('YOUR_APP_ID', 'YOUR APP ID');

    //uses the PHP SDK.  Download from https://github.com/facebook/php-sdk
    require 'facebook.php';

    $facebook = new Facebook(array(
      'appId'  => YOUR_APP_ID,
      'secret' => 'YOUR APP SECRET',
    ));

    session_start();

    $userId = $facebook->getUser();
    if ($userId && !isset($_SESSION['fbdata'])) 
        $_SESSION['fbdata'] = array("userid" => $userId);
    
?>

<html>
    <body>
    <?php if ($userId) 
        $userInfo = $facebook->api('/' + $userId); ?>
        Welcome <?= $userInfo['name'] ?>
    <?php  else  ?>
        <div id="fb-root"></div>
        <fb:login-button></fb:login-button>
    <?php  ?>
        <script type="text/javascript">
            window.fbAsyncInit = function() 
                FB.init(
                    appId      : '<?= YOUR_APP_ID ?>',
                    status     : true, 
                    cookie     : true,
                    xfbml      : true,
                    oauth      : true,
                );

                FB.Event.subscribe('auth.login', function(response) 
                    window.location.reload();
                );
            ;

            (function(d)
                var js, id = 'facebook-jssdk'; if (d.getElementById(id)) return;
                js = d.createElement('script'); js.id = id; js.async = true;
                js.src = "//connect.facebook.net/en_US/all.js";
                d.getElementsByTagName('head')[0].appendChild(js);
            (document));
        </script>
    </body>
</html>

我刚刚将用户数据的保存添加到会话中。 现在,如果你使用这种方法,当用户进入你的页面时,你应该检查他是否已经有一个会话,如果一切都很好,则不需要对他进行身份验证。

如果您想将用户从您的应用程序中注销,而不是从 facebook 中注销,只需销毁该会话:

session_start(); 
session_destroy();

这应该会删除您为用户保存的所有数据,下次他访问您的页面时,您可以重新开始。

我不是 php 程序员,我在这里使用的所有 php 都来自我(非常)有限的知识和我发现的东西。

【讨论】:

是的,我已经尝试过这种方法。但正如我在上一次给您的回复中所说,我刚刚明白为什么 facebook sdk 将用户完全从网站和 facebook 中注销。例如,用户弹出一个浏览器并访问该站点,使用 fb 登录,他登录到该站点,并且在同样的操作中他也登录到了 facebook。如果我只是为了破坏站点的会话,由于之前的操作,用户仍然登录到 facebook,但他/她可能不想要这个。 我想要的是:1.) 用户(未登录到 fb 或站点)通过 fb 登录登录到站点,注销并且 fb 会话也被破坏。 2.) 用户(登录到 fb,而不是站点),通过 fb 登录登录到站点,退出站点但保持 fb 会话。 当然。 Facebook 为您提供了让用户退出其平台的方法,但是否采用这种方法或仅从您的站点登录用户取决于您和您的应用程序。您问如何从您的应用程序中而不是从 facebook 中注销用户,这就是我试图帮助您解决的问题。如果您不想做出选择,可以有两种不同类型的按钮:“退出网站和 fb”和“退出网站”,让用户决定。 据我所知,您无法知道用户是否已登录 Facebook。您使用他们的身份验证机制,其中包括几个阶段,并且只有在用户 (1) 登录 facebook (2) 授权您的应用程序和 (3) 后,您才能重新集成到流程中,这是可选的 - 用户授予您您要求的权限(或部分) 是的,我很欣赏这一点,也许我什至可以找到一种动态促进它的方法。但无论如何,我只是想知道是否有一种我一直错过的受支持的方法。

以上是关于如何从 facebook 应用程序注销用户,但保持从 facebook 登录的主要内容,如果未能解决你的问题,请参考以下文章

使用社交框架从 Facebook 注销

如何在不使用 Facebook 登录/注销按钮的情况下以编程方式从 Facebook SDK 3.0 注销?

当他们使用通过 facebook 连接时,无法从站点注销用户

如何确定用户是不是已使用 Graph API 从 Facebook iOS 注销?

Facebook 注销工作正常,但未完全注销

强制注销facebook oauth