Codeigniter, Facebook javascript SDK, PHP SDK Redirect after facebook login doesn't getUser() until refresh

11,897

Well I seem to have figured this out. I made this change to the javascript:

    FB.Event.subscribe('auth.login', function(response) {
    FB.api('/me', function(response) {
    window.location.reload();
    });
});

I guess that by adding the FB.api('/me', function(response){}); it somehow made the getUser() return true. If anyone else is having getUser() return 0 try this. Anyway I hope this helps others :)

Share:
11,897
Admin
Author by

Admin

Updated on June 12, 2022

Comments

  • Admin
    Admin almost 2 years

    The process is as follows.

    1. User clicks Facebook Login button
    2. User signs in and grants perms
    3. Facebook redirects uses FB.Event.subscribe auth.login to redirect my login controller
    4. My login controller loads the fbconnect module and chains the method Connect()
    5. Connect() Checks if there is a facebook user using getUser() and if true checks if they are an existing user to log them in or returns false if no facebook user was found.
    

    Everything works except the only problem is after being redirected to the login page Connect returns False when it should in fact be true sine the fbuser is logged in and has granted perms. If I refresh however everything works, the user is logged in if exists or if new is sent to the signup page. Below is my code..

          <div id="fb-root"></div>
        <script>
          //initializing API
          window.fbAsyncInit = function() {
            FB.init({appId: '(My app id)', status: true, cookie: true,
                     xfbml: true, // channel.html file
                     oauth  : true
                     });
                     FB.Event.subscribe('auth.login', function(response) {
                     window.location='http://www.(Mysite).com/login';
                     });
                     FB.Event.subscribe('auth.logout', function(response) {
                     window.location='http://www.(Mysite).com/logout';
                     });
                     };
          (function() {
            var e = document.createElement('script'); e.async = true;
            e.src = document.location.protocol +
              '//connect.facebook.net/en_US/all.js';
            document.getElementById('fb-root').appendChild(e);
          }());
        </script>
    

    Fbconnect.php

    class Fbconnect extends MX_Controller {
    public $fb_user = null;
    public $fb_user_id = null;
    
    // Initilize Fabebook
    public function __construct() 
    {   
        parent::__construct();
        $this->config->load("facebook");
        require 'facebook.php';
    
        $this->facebook = new Facebook(array(
          'appId' => $this->config->item('appId'),
          'secret' => $this->config->item('Secret')
        ));
    
    
        // Get user from FB
        $this->fb_user_id = $this->facebook->getUser();
    
        if ($this->fb_user_id):
          try {
            // Proceed knowing you have a logged in user who's authenticated.
            $this->fb_user = (object)$this->facebook->api('/me');
          } catch (FacebookApiException $e) {
            error_log($e);
            $this->fb_user = null;
          }
        endif;
    
    }
    
    
    public function connect(){
    
        // Check for FB object
        if($this->fb_user):
            // FB Object found
                // Check if user exists
                $this->load->model('facebook/m_facebook');
                $user = $this->m_facebook->getUser($this->fb_user->id);
    
                // If we find a user and fb connect is true
                if($user):
                    // user found log them in
                    if($this->ion_auth->login($user->username, $user->password, true, true)):
                       redirect('', 'refresh');
                    endif;
                else:
                // There is a fb object & the user is not logged in & doesnt exist in db yet must be new 
                    redirect('signup/facebook', 'refresh');
                endif;
        else: 
            // No FB user or user not logged in                                  
            return false;
        endif;    
    }
    

    The auth/login code (just the part that involves facebook)

     $this->load->module('facebook/fbconnect')->connect(); 
    
  • eskimo
    eskimo over 7 years
    I have exactly the same problem but I only use the PHP SDK. Any suggestions on how to solve this problem in that case?