简体   繁体   中英

Laravel facebook-sdk bundle logout not working

I am using Facebook-sdk bundle for Laravel and everything works fine, except the logout link. When I click logout, I get redirected and all looks like it is working, but when it loads the page back, I'm still logged in?

Is this a Laravel problem maybe? Does it store sessions differently?

I've built this class, but as I said, I don't think this is a problem because all is working fine, except logout session is not getting cleared.

Code:

class Fb{

    // -----------------------------------------------------------------------
    // Variables

    private $ioc; // IOC container

    public $state; // If logged or not

    public $data; // Data that came from request
    public $settings = array("name,gender");


    // -----------------------------------------------------------------------
    // Logical functions
    public function __construct(){
        $this->ioc = IoC::resolve('facebook-sdk');

        if ($this->getUser()) {
            try {
                $this->request();
                $this->state = true;
            } catch (FacebookApiException $e) {
                error_log($e);
        }
        }else{
            $this->state = false;
        }
    }

    public function getUser(){
        return $this->ioc->getUser();
    }

    public function request(){
        $this->data = $this->ioc->api("/me?fields=".implode($this->settings));
    }

    public function debug(){
        return dd($this->data);
    }

    // -----------------------------------------------------------------------
    // Login & Logout links

    public function login(){
        return $this->ioc->getLoginUrl();
    }

    public function logout(){
        return $this->ioc->getLogoutUrl();
    }

    // -----------------------------------------------------------------------
    // Get data via SDK

    // Name
    public function name(){
        return $this->data['name'];
    }

    // Picture
    public function picture($w=50,$h=50){
        return "https://graph.facebook.com/". $this->data['id'] ."/picture?width=$w&height=$h";
    }

    // Gender
    public function gender(){
        return $this->data['gender'];
    }

}

Thanks for any help! Cheers!

The underlying facebook php sdk uses the built in php sessions (by default) to store persistent information like the authenticated facebook user's id. However the sdk won't destroy this information on its own since it's difficult to tell when that should happen automatically.

You can clear this persisted information with the destroySession method on the facebook sdk object. The best place to call this method is on the logout url's redirect back endpoint, since that is where the visitor gets directly after facebook done with it's own logout.

This would look like:

// method on Fb class
public function destroySession() {
    // just forward the call down to the sdk object
    $this->ioc->destroySession();
}

You probably want to set up a route where users will arrive after logout and pass it into getLogoutUrl() like this:

// method on Fb class
public function logout(){
    // tell explicity where to send the user when facebook is done, otherwise the current url will be used
    return $this->ioc->getLogoutUrl(array('next' => URL::to_route('after_logout')));
}

And have a route like this:

Route::get('after_logout', array('as' => 'after_logout', 'do' => function() {
    $fb = new Fb();
    // call the session clearing
    $fb->destroySession();
    // send the user to its merry way
    return Redirect::to('/');

}));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM