Question

So I'm having an annoying problem I can't seem to solve, and it's stressing me out way too much, lol.

Anyways, I am wanting to add on the FB login/signup on top of my already configured login/signup system. I want it so that new users can come in and connect using facebook, but I can't retreive their email using the FB, I could only retrieve mine for some reason.

I want to retreive their info, like username, email, timezone, etc so I can store it into a database so I can do checks if they're logged in or not and have them create their own little profiles in my website. But I can't I'm only getting public info....

In my controller, I'm stuck because I want to input info into my model, but can't get the info from facebook.

Also is there any way I can retrieve facebook info from a POST request? Because that's how my current model is retreiving the information..

This is in my login.php controller:

<?php

class Login extends CI_Controller
{
    var $user = null, $logoutUrl = null, $loginUrl = null;

    function __construct()
    {
        parent::__construct();

        // App stuff
        $data['appId'] = 'erased';
        $data['secret'] = 'erased for obvious reasons';

        // Load facebook library
        $this->load->library('facebook', $data);

        //Get User ID
        $this->user = $this->facebook->getUser();

        if ($this->user)
        {
            try
            {
                // Proceed knowing you have a logged in user who's authenticated
                $this->user = $this->facebook->api('/me');
                $this->logoutUrl = $this->facebook->getLogoutUrl(array('next' => base_url() . 'logout'));
            }
            catch (FacebookApiException $e)
            {
                error_log($e);
                $this->user = null;
            }
        }
    }

    function index()
    {
        if ($this->user) // If user is authenticated
        {
            $choice = 2;
            $this->validate_credentials($choice);
        }

        else if (!(isset($is_logged_in)) || $is_logged_in != true)
        {
            $is_logged_in = $this->session->userdata('is_logged_in');
            $data['main_content'] = 'loginform_view';
            $data['title'] = 'Login!';
            $data['login_error'] = FALSE;
            $this->load->view('includes/template', $data);
        }
        else
            redirect('take_snapshot');
    }

    function validate_credentials($choice = '')
    {
        $this->load->model('membership_model');

        if ($choice === 2) // If user uses Facebook login
        {
            print_r($this->user); // Only prints public info!! ):
        }

        else if ($choice !== 2) // If user uses normal login
        {
            $query = $this->membership_model->validate();

            if ($query) // if credentials are validated
            {
                $data = array(
                    'username' => strtolower($this->input->post('username')),
                    'is_logged_in' => TRUE
                );

                $data['login_error'] = FALSE;
                $this->session->set_userdata($data);
                redirect('take_snapshot');
            }

            else
            {
                $data['main_content'] = 'loginform_view';
                $data['title'] = 'Login!';
                $data['login_error'] = TRUE;
                $this->load->view('includes/template', $data);
            }
        }
    }
}

?>

This is in my header:

<!-- START Facbook Javascript API -->
        <div id="fb-root"></div>
        <script>
          window.fbAsyncInit = function() {
          FB.init({
            appId      : 'MY ID [erased for obvious reasons]',
            status     : true, // check login status
            cookie     : true, // enable cookies to allow the server to access the session
            xfbml      : true  // parse XFBML
          });

          // Here we subscribe to the auth.authResponseChange JavaScript event. This event is fired
          // for any authentication related change, such as login, logout or session refresh. This means that
          // whenever someone who was previously logged out tries to log in again, the correct case below 
          // will be handled. 
          FB.Event.subscribe('auth.authResponseChange', function(response) {
            // Here we specify what we do with the response anytime this event occurs. 
            if (response.status === 'connected') {
              // The response object is returned with a status field that lets the app know the current
              // login status of the person. In this case, we're handling the situation where they 
              // have logged in to the app.
              testAPI();
            } else if (response.status === 'not_authorized') {
              // In this case, the person is logged into Facebook, but not into the app, so we call
              // FB.login() to prompt them to do so. 
              // In real-life usage, you wouldn't want to immediately prompt someone to login 
              // like this, for two reasons:
              // (1) JavaScript created popup windows are blocked by most browsers unless they 
              // result from direct interaction from people using the app (such as a mouse click)
              // (2) it is a bad experience to be continually prompted to login upon page load.
              FB.login();
            } else {
              // In this case, the person is not logged into Facebook, so we call the login() 
              // function to prompt them to do so. Note that at this stage there is no indication
              // of whether they are logged into the app. If they aren't then they'll see the Login
              // dialog right after they log in to Facebook. 
              // The same caveats as above apply to the FB.login() call here.
              FB.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));

          // Here we run a very simple test of the Graph API after login is successful. 
          // This testAPI() function is only called in those cases. 
          function testAPI() {
            /*
            console.log('Welcome!  Fetching your information.... ');
            FB.api('/me', function(response) {
              console.log('Good to see you, ' + response.name + '.');
            });
            */

           window.location = '<?php echo base_url(); ?>login/validate_credentials';
          }
        </script>
Was it helpful?

Solution

You are missing the scope parameter in your login code. To ask for the permissions other than the basic permissions/friends list etc. you have to add permissions using a parameter- scope in your code.

So, replace FB.login() with-

FB.login(function(response) {
   // handle the response
}, {scope: 'email'});

You can find the list of permissions here.

OTHER TIPS

You need a special permission granted to return the users email.

There are two ways to do it but this easiest is to just add a scope to the log-in button.

<fb:login-button id="loginBtn" max_rows="1" scope="basic_info,email" size="medium" show_faces="false" auto_logout_link="true"></fb:login-button>

You can pass as many permission you like in the scope.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top