【问题标题】:getLogoutUrl is not working with facebook graphp api using php codeignitergetLogoutUrl 不适用于使用 php codeigniter 的 facebook graphp api
【发布时间】:2015-08-13 12:02:48
【问题描述】:

当我单击我的注销 url 时,我的 facebook php sdk getLogoutUrl 无法正常工作。 它带我回到我给定的重定向 url,但它不会破坏我的 facebook 会话我仍然可以在我的页面和注销 url 上看到我的 var_dump($fb_data) 数组。

这是我正在使用 codeigniter 的代码 我的 lib_login 库函数 facebook 代码

 public function facebook()
    {
        $facebook_default_scope = explode(',', $this->ci->config->item("facebook_default_scope"));
        $facebook_app_id = $this->ci->config->item("facebook_app_id");
        $facebook_api_secret = $this->ci->config->item("facebook_api_secret");

        // init app with app id and secret
        FacebookSession::setDefaultApplication($facebook_app_id, $facebook_api_secret);

        // login helper with redirect_uri
        $helper = new FacebookRedirectLoginHelper(site_url('login/facebook'));
        // see if a existing session exists
        if (isset($_SESSION) && isset($_SESSION['fb_token'])) {
            // create new session from saved access_token
            $session = new FacebookSession($_SESSION['fb_token']);

            // validate the access_token to make sure it's still valid
            try {
                if (!$session->validate()) {
                    $session = null;
                }
            } catch (Exception $e) {
                // catch any exceptions
                $session = null;
            }
        }

        if (!isset($session) || $session === null) {
            // no session exists

            try {
                $session = $helper->getSessionFromRedirect();
            } catch(FacebookRequestException $ex) {
                // When Facebook returns an error
                // handle this better in production code
                print_r($ex);
            } catch(Exception $ex) {
                // When validation fails or other local issues
                // handle this better in production code
                print_r($ex);
            }
        }

        // see if we have a session
        if (isset($session)) {
            // save the session
            $_SESSION['fb_token'] = $session->getToken();
            // create a session using saved token or the new one we generated at login
            $session = new FacebookSession($session->getToken());

            // graph api request for user data
            $request = new FacebookRequest($session, 'GET', '/me?fields=id,name,accounts{access_token,category,name,id,perms},permissions');
            $response = $request->execute();
            // get response
            $graphObject = $response->getGraphObject()->asArray();
            $logoutUrl = site_url('login');
            $fb_data = array(
                'me' => $graphObject,
                'loginUrl' => $helper->getLoginUrl($facebook_default_scope),
                'logoutUrl' => $helper->getLogoutUrl($session,$logoutUrl),
           );
            $this->ci->session->set_userdata('fb_data', $fb_data);

        } else {
            $fb_data = array(
                'me' => null,
                'loginUrl' => $helper->getLoginUrl($facebook_default_scope),
                'logoutUrl' => $helper->getLogoutUrl($session,$logoutUrl),
           );
            $this->ci->session->set_userdata('fb_data', $fb_data);
        }

        return $fb_data;
    }

这是我的控制器的功能

 public function facebook()
    {
        $fb_data = $this->lib_login->facebook();


        if (isset($fb_data['me'])) {
            echo "<pre>";
             var_dump($fb_data);
            echo "</pre>";
            echo '<a href="' . $fb_data['logoutUrl'] . '">logout</a>';
        } else {
            echo '<a href="' . $fb_data['loginUrl'] . '">Login</a>';
        }
    }

当我使用此代码登录我的帐户时,注销 url 和 $fb_data 数组会出现在我的页面上,但是当我注销并刷新我的页面时,它仍然是他们的。有人能告诉我这里做错了什么吗。

【问题讨论】:

  • 您想要创建一个页面或方法,您将取消设置 fb_token 并通过 header('Location: login.php'); 或 CI redirect('controller/method', 'refresh');
  • @Tpojka 我只是想在我点击 logut url 时破坏 Facebook 会话,它应该带我进入登录页面。如果我去 login/facebook 方法 uri 那么它应该向我显示一个登录 url 而不是var_dump($fb_data);
  • 最近我看到了 google auth 视频系列,使用(谷歌和 Facebook)非常相似,我可以告诉你需要取消设置创建的会话。检查here
  • @Tpojka 这是给 google 我需要这个给 facebook :(
  • 所以按照我在第一条评论中所写的示例并取消设置 fb 会话。 2¢

标签: php facebook codeigniter facebook-graph-api facebook-php-sdk


【解决方案1】:

试试这样的:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Login extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library(array('session', 'lib_login'));
        $this->fb_data = $this->lib_login->facebook();
    }
    /**
     * facebook login
     *
     * @return void
     * @author appleboy
     **/
    public function facebook()
    {
        // check login data
        if (isset($this->fb_data['me'])) {
            var_dump($this->fb_data);
        } else {
            echo '<a href="' . $this->fb_data['loginUrl'] . '">Login</a>';
        }
    }

    public function logout()
    {
        if ( isset($this->fb_data['me']) ) {
            $this->session->unset_userdata('fb_data');
        }
        redirect('login/facebook', 'refresh');
    }

}
/* End of file login.php */
/* Location: ./application/controllers/login.php */

【讨论】:

  • 它正在重定向我 redirect('login/facebook','refresh');但它仍然向我显示 var_dump($fb_data['me']); 中的值在页面上...所以注销仍然无法正常工作
  • 你在使用其他标签页吗?
  • 没有其他选项卡,问题是您取消设置 CI 会话数据而不是 Facebook 会话数据 $this->session->unset_userdata('fb_data');
  • 可能在代码更改过程中有些混乱。从浏览器中手动删除会话。不如再试一次。
  • 是我们可以使用的任何方式 $fb_data = $this->lib_login->facebook();只获得一次这个值,这样我们就不必每次都在我们的两个函数中定义它
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 2012-02-26
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多