【问题标题】:CakePHP facebook integration logout issue with CakePHP-Facebook-PluginCakePHP facebook 与 CakePHP-Facebook-Plugin 的集成注销问题
【发布时间】:2012-02-04 01:45:10
【问题描述】:

我正在寻找一种方法,让CakePHP-Facebook-Plugin 将用户从我的应用程序中注销,但不让他们从他们自己的 facebook 中注销。

如果我调用我的应用程序 logout() 函数,无论我做什么,我都会继续通过 facebook 重新登录。如果我在视图中使用插件 facebook helper 来生成注销按钮 ($this->Facebook->logout()),它肯定会将用户从我的应用程序中注销……但它也会将他们从他们自己的 facebook 中注销这有点荒谬。

那么我该如何解决这个问题,让用户退出我的应用程序,但让他们登录到 Facebook。

【问题讨论】:

    标签: cakephp facebook


    【解决方案1】:

    要让他们“注销”您的应用(意味着他们下次尝试使用该应用时,将要求他们再次验证您的应用),然后使用他们的发送 HTTP DELETE 命令到me/permissions用户访问令牌。

    【讨论】:

    • 我会试一试,但我不确定这是否是我正在寻找的行为。我正在寻找大多数网站似乎通过 facebook 集成来管理的行为。那是第一次使用 facebook 登录时,系统会提示您允许应用程序权限。您可以从应用程序中随意注销,并且您可以随时选择使用 facebook 重新登录,并且不会再次提示。这是我在大多数网站上看到的,一个简单的例子是 imgur.com
    • 然后使用 Coder 在他们的回答中所说的内容。 session_destroy 将在您的网站上结束会话,而不是在 Facebook 的网站上。
    • 是的,我真的希望是这样(而且没有这个 facebook 插件)。使用 facebook 插件,用户在刷新或导航到另一个页面后立即重新登录
    • 那么你的第三个选项是调用 FB.logout(),它也会将他们从 facebook 中注销。 (在我看来不是很友好)
    • 是的,这就是我们现在所拥有的,是的,它并不十分令人满意。答案是这样的图书馆?
    【解决方案2】:

    我知道这是一个老问题,但我刚刚想出了这个问题,试图弄清楚同样的事情。基本上,虽然在带有 webtechnick 示例的演示中,他将“Facebook.Connect”放在 AppController 中,但是,如果您想要选择性注销部分,放置它的最佳位置是在您想要使用它的实际控制器中或把它放在 AppController 中并将noAuth=> true 传递给它。无论哪种方式,无论您选择哪种方式,您都设置了一个控制器 (facebook_controller.php?) 来处理登录,并将其组件设置为 noauth 设置为 false(这是默认设置)。这样,您就可以完全控制用户是否重新登录网站,并且您可以实际注销他们(使用常规的redirect($this->Auth->logout());

    让我给你一个想法:

    app_controller.php

    class AppController extends Controller {
        var $components = array('Auth', 'Acl', 'Session');
           //or if you want access to "$this->Connect" universally:
           //   array('Auth', 'Facebook.Connect' => 
           //                      array('noauth'=>'true', 'Acl', 'Session');
    }
    

    users_controller.php:

    class UsersController extends AppController{
    var $helpers = array('Facebook.Facebook');
            //an example of the users controller, enabling connect, but
            // not authorizing the user (because logout() used by Auth is here)
        var $components = array('Email', 'Session', 'Facebook.Connect' => array('createUser'=>false, 'noauth'=>true));
    
            //login() doesnt need to be shown and can be left alone
    
            function logout(){
                  if ($this->Connect->FB->getUser() == 0){
                        $this->redirect($this->Auth->logout());
            }else{
                    //ditch FB data for safety
                    $this->Connect->FB->destroysession();
                    //hope its all gone with this
            session_destroy();
                    //logout and redirect to the screen that you usually do.
            $this->redirect($this->Auth->logout());
            }
            }
    }
    

    你的“facebook_controller.php”: 类 FacebookaController 扩展 AppController { ... // 我个人不喜欢让他的作品创建我的用户,所以: var $components = array('Facebook.Connect' => array('createUser'=>false)); ...

    function login(){
    //just need this stub function for later
    $this->autoRender = false;
    }
    
    //you also need this for deauths or they will still be able to get into the site after deauth (against policy or whatever)
        function deauthorize(){
        //get user id from facebook API
        $uid = $this->Connect->FB->getUser();
        $record = $this->User->findByFacebookId($uid);
        $this->User->delete($record['id'], FALSE);  
        }
    }
    

    现在你的 users/login.ctp 文件:

    <script>
      window.fbAsyncInit = function() {
        FB.init({
          appId      : 'your app id', // App ID
          channelUrl : '//'+window.location.hostname+'/facebook/channel', // Channel File
          status     : true, // check login status
          cookie     : true, // enable cookies to allow the server to access the session
          xfbml      : true  // parse XFBML
        });
    
        // Additional initialization code here
        FB.Event.subscribe('auth.statusChange', function(response){
            if (response.status == "connected"){
                alert('redirecting you to auto facebook login');
                    //here is out default place for login
                window.location.href = "http://"+window.location.hostname + "/facebook/login";
            }
        });
      };
    
      // Load the SDK Asynchronously
      (function(d){
         var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js";
         ref.parentNode.insertBefore(js, ref);
       }(document));
    </script>
    <?php e($this->Facebook->login(array('registration-url'=>'http://www.yoursite.com/facebook/signup'))); ?>
    

    应该差不多了。我希望这对阅读本文但仍需要帮助的人有所帮助。

    【讨论】:

      【解决方案3】:

      你可能想看看 $this->Facebook->disconnect();

      它完全符合您的要求。

      http://projects.webtechnick.com/docs/facebook/default/FacebookHelper.html#disconnect

      【讨论】:

        【解决方案4】:

        你试过杀死PHP session?

         // this would destroy the session variables 
         session_destroy(); 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多