Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Login with Facebook using Facebook SDK for PHP

I have problems with making login to my site with Facebook.

I have created login using Facebook SDK by following the tutorial at developers.facebook.com , but it does not work for me.

I have wrote a simple test page to find out, what goes wrong. This is the code:

<!DOCTYPE html>
<html>
<head></head>
<body>
<pre>
<?php

$app_id         = '446458238729594';
$app_secret     = '********';
$redirect_uri   = 'http://mysite.localhost/';

try {

    echo( 'Including "facebook.php"...' );
    require './src/facebook.php';
    echo( "done.\n\n" );

    echo( 'Starting session...' );
    $result = session_start();
    if( $result ) {
        echo( "done.\n\n" );
        echo( "\n=====>>>>> Session array:\n" . var_export( $_SESSION, true )
                . "\n\n" );
    } else {
        echo( "fail.\n\n" );
        echo( "\n=====>>>>> Session array:\n" . var_export( $_SESSION, true )
                . "\n\n" );
    }

    echo( "Trying to get counter from the session...\n");
    if( isset( $_SESSION['counter'] ) ) {
        echo( 'Value: ' . $_SESSION['counter'] . "\n" );
        echo( "Increasing to one...\n");
        $_SESSION['counter']++;
        echo( "done.\n" );
        echo( 'Value: ' . $_SESSION['counter'] . "\n\n" );
    } else {
        echo( "fail.\n" );
        echo( "Trying to add a counter and set it's value to 0...\n");
        $_SESSION['counter'] = 0;
        echo( 'Value: ' . $_SESSION['counter'] . "\n" );
        echo( "done.\n\n" );
    }

    echo( 'Creating an instance of Facebook class...' );
    $facebook = new Facebook(
        array(
            'appId'     => $app_id,
            'secret'    => $app_secret,
        )
    );
    echo( "done.\n\n" );
    echo( "The instance of Facebook class:\n" . str_replace( $app_secret,
            '>>>APP_SECRET<<<', var_export( $facebook, true ) ) . "\n\n" );

    echo( "\n=====>>>>> Session array:\n" . var_export( $_SESSION, true )
            . "\n\n" );

    echo( 'Trying to get user ID...' );
    $user_id = $facebook->getUser();
    echo( "done.\n\n" );
    echo( "User ID:\n" . var_export( $user_id, true ) . "\n\n" );

    echo( "\n=====>>>>> Session array:\n" . var_export( $_SESSION, true )
            . "\n\n" );

    echo( 'Trying to get user profile info...' );
    try {
        $user_profile = $facebook->api( '/me' );
        echo( "done.\n\n" );
        echo( "User profile info:\n" . var_export( $user_profile, true )
                . "\n\n" );
    } catch( Exception $exception ) {
        echo( "fail. Probably user is not logged in.\n\n" );
        echo( "Exception:\n--------\n" . str_replace( $app_secret,
                '>>>APP_SECRET<<<', var_export( $exception, true ) )
                . "\n--------\n\n" );
        $user_id = null;
        echo( "User ID is now NULL.\n\n" );
    }

    echo( "\n=====>>>>> Session array:\n" . var_export( $_SESSION, true )
            . "\n\n" );

    if( $user ) {
        echo( 'Seems like user is logged in. Getting logout url...' );
        $url = $facebook->getLogoutUrl();
        echo( "done.\n\n" );
    } else {
        echo( 'Seems like user is NOT logged in. Getting login url...' );
        $url = $facebook->getLoginUrl(
            array(
                'scope'         => 'read_stream, publish_stream, user_birthday,'
                        . ' user_location, user_work_history, user_hometown,'
                        . ' user_photos',
                'redirect_uri'  => $redirect_uri,
            )
        );
        echo( "done.\n\n" );
    }
    echo( 'URL:<br></pre><a href=' . $url .">Login / Logout</a><pre>\n\n" );

    echo( "\n=====>>>>> Session array:\n"
            . var_export( $_SESSION, true ) . "\n\n" );

    if( $user ) {
        echo( 'Seems like user is still logged in. Trying to get some profile'
                . ' info...' );
        echo( "\nCreating request...\n" );
        $queries = array(
            array(
                'method'        => 'GET',
                'relative_url'  => '/' . $user,
            ),
            array(
                'method'        => 'GET',
                'relative_url'  => '/' . $user . '/home?limit=50',
            ),
            array(
                'method'        => 'GET',
                'relative_url'  => '/' . $user . '/friends',
            ),
            array(
                'method'        => 'GET',
                'relative_url'  => '/' . $user . '/photos?limit=6',
            ),
        );
        echo( "Request:\n\n" . var_export( $queries, true ) . "\n\n" );
        echo( "\nEncoding request using JSON format...\n" );
        $queries_encoded = json_encode( $queries );
        echo( "Encoded request:\n\n" . var_export( $queries_encoded, true )
                . "\n\n" );
        try {
            echo( "\nTrying to get response...\n" );
            $response = $facebook->api( '?batch=' . $queries_encoded, 'POST' );
            echo( "Response:\n\n" . var_export( $response, true ) . "\n\n" );
            echo( "\nTrying to decode response...\n" );
            echo( "\n" . json_decode( $response[0]['body'], true ) . "\n" );
            echo( "\n" . json_decode( $response[1]['body'], true ) . "\n" );
            echo( "\n" . json_decode( $response[2]['body'], true ) . "\n" );
            echo( "\n" . json_decode( $response[3]['body'], true ) . "\n" );
            echo( "\n\ndone.\n\n" );
        } catch( Exception $exception ) {
            echo( "fail.\n\n" );
            echo( "Exception:\n--------\n\n" . str_replace( $app_secret,
                    '>>>APP_SECRET<<<', var_export( $exception, true ) )
                    . "\n--------\n\n" );
        }
    } else {
        echo( 'Seems like user is still NOT logged in. At now we can\'t do'
                . ' anything. Try to login using the URL above.' );
    }

    echo( "\n\n========\n\nSession array:\n" . var_export( $_SESSION, true )
            . "\n\n" );

} catch( Exception $exception ) {
    echo( "\n\n\nAn exception have been trown:\n--------\n\n" . str_replace(
            $app_secret, '>>>APP_SECRET<<<', var_export( $exception, true ) )
            . "\n--------\n\n" );
    echo( "\n\n========\n\nSession array:\n" . var_export( $_SESSION, true )
            . "\n\n" );
}

?>
</pre>
</body>
</html>

After the first visit of this page (I am not logged in at Facebook), I get this output:

Including "facebook.php"...done.

Starting session...done.


=====>>>>> Session array:
array (
)

Trying to get counter from the session...
fail.
Trying to add a counter and set it's value to 0...
Value: 0
done.

Creating an instance of Facebook class...done.

The instance of Facebook class:
Facebook::__set_state(array(
   'sharedSessionID' => NULL,
   'appId' => '446458238729594',
   'appSecret' => '>>>APP_SECRET<<<',
   'user' => NULL,
   'signedRequest' => NULL,
   'state' => NULL,
   'accessToken' => NULL,
   'fileUploadSupport' => false,
   'trustForwarded' => false,
))


=====>>>>> Session array:
array (
  'counter' => 0,
)

Trying to get user ID...done.

User ID:
0


=====>>>>> Session array:
array (
  'counter' => 0,
)

Trying to get user profile info...fail. Probably user is not logged in.

Exception:
--------
FacebookApiException::__set_state(array(
   'result' => 
  array (
    'error_code' => 7,
    'error' => 
    array (
      'message' => 'Failed to connect to 2a03:2880:2050:1f01:face:b00c:0:2: Network is unreachable',
      'type' => 'CurlException',
    ),
  ),
   'message' => 'Failed to connect to 2a03:2880:2050:1f01:face:b00c:0:2: Network is unreachable',
   'string' => '',
   'code' => 7,
   'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
   'line' => 967,
   'trace' => 
  array (
    0 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
      'line' => 899,
      'function' => 'makeRequest',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => 'https://graph.facebook.com/me',
        1 => 
        array (
          'method' => 'GET',
          'access_token' => '446458238729594|>>>APP_SECRET<<<',
        ),
      ),
    ),
    1 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
      'line' => 866,
      'function' => '_oauthRequest',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => 'https://graph.facebook.com/me',
        1 => 
        array (
          'method' => 'GET',
        ),
      ),
    ),
    2 => 
    array (
      'function' => '_graph',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => '/me',
      ),
    ),
    3 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
      'line' => 644,
      'function' => 'call_user_func_array',
      'args' => 
      array (
        0 => 
        array (
          0 => 
          Facebook::__set_state(array(
             'sharedSessionID' => NULL,
             'appId' => '446458238729594',
             'appSecret' => '>>>APP_SECRET<<<',
             'user' => 0,
             'signedRequest' => NULL,
             'state' => NULL,
             'accessToken' => '446458238729594|>>>APP_SECRET<<<',
             'fileUploadSupport' => false,
             'trustForwarded' => false,
          )),
          1 => '_graph',
        ),
        1 => 
        array (
          0 => '/me',
        ),
      ),
    ),
    4 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/index.php',
      'line' => 69,
      'function' => 'api',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => '/me',
      ),
    ),
  ),
   'previous' => NULL,
))
--------

User ID is now NULL.


=====>>>>> Session array:
array (
  'counter' => 0,
)

Seems like user is NOT logged in. Getting login url...done.

URL:
Login / Logout


=====>>>>> Session array:
array (
  'counter' => 0,
  'fb_446458238729594_state' => '84260edcd60940884d261812496a488c',
)

Seems like user is still NOT logged in. At now we can't do anything. Try to login using the URL above.

========

Session array:
array (
  'counter' => 0,
  'fb_446458238729594_state' => '84260edcd60940884d261812496a488c',
)

Then I try to login using the given URL. It leads me to my Facebook app authorization page. After confirming the requested permissions, it redirects me to this URL:

http://mysite.localhost/?state=84260edcd60940884d261812496a488c&code=AQDkHPlXXweEiTjXg-sUXwwQAy0_xRYc89Opfz6AF9dlGOomCSG7fjf0440ctHuADKMEG4P7CheeNx9PnwUta-jkfpm03MjDCKyieOZpIPG-evlKYm64mRxD2Q5f_-HJROIC9I_-lHswr5RT3huSQySA55pD28b07Ouv87NqihZ1brGfU-_0LyhcdldtNikb-2xn6NRpa17xEmU37pBqDV1r#_=_

After that I expect that I am logged in and my page retrieves and shows me some info from my Facebook profile, but it doesn't. I get this output:

Including "facebook.php"...done.

Starting session...done.


=====>>>>> Session array:
array (
  'counter' => 0,
  'fb_446458238729594_state' => '84260edcd60940884d261812496a488c',
)

Trying to get counter from the session...
Value: 0
Increasing to one...
done.
Value: 1

Creating an instance of Facebook class...done.

The instance of Facebook class:
Facebook::__set_state(array(
   'sharedSessionID' => NULL,
   'appId' => '446458238729594',
   'appSecret' => '>>>APP_SECRET<<<',
   'user' => NULL,
   'signedRequest' => NULL,
   'state' => '84260edcd60940884d261812496a488c',
   'accessToken' => NULL,
   'fileUploadSupport' => false,
   'trustForwarded' => false,
))


=====>>>>> Session array:
array (
  'counter' => 1,
  'fb_446458238729594_state' => '84260edcd60940884d261812496a488c',
)

Trying to get user ID...done.

User ID:
0


=====>>>>> Session array:
array (
  'counter' => 1,
)

Trying to get user profile info...fail. Probably user is not logged in.

Exception:
--------
FacebookApiException::__set_state(array(
   'result' => 
  array (
    'error_code' => 7,
    'error' => 
    array (
      'message' => 'Failed to connect to 2a03:2880:2050:1f01:face:b00c:0:2: Network is unreachable',
      'type' => 'CurlException',
    ),
  ),
   'message' => 'Failed to connect to 2a03:2880:2050:1f01:face:b00c:0:2: Network is unreachable',
   'string' => '',
   'code' => 7,
   'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
   'line' => 967,
   'trace' => 
  array (
    0 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
      'line' => 899,
      'function' => 'makeRequest',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => 'https://graph.facebook.com/me',
        1 => 
        array (
          'method' => 'GET',
          'access_token' => '446458238729594|>>>APP_SECRET<<<',
        ),
      ),
    ),
    1 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
      'line' => 866,
      'function' => '_oauthRequest',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => 'https://graph.facebook.com/me',
        1 => 
        array (
          'method' => 'GET',
        ),
      ),
    ),
    2 => 
    array (
      'function' => '_graph',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => '/me',
      ),
    ),
    3 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/src/base_facebook.php',
      'line' => 644,
      'function' => 'call_user_func_array',
      'args' => 
      array (
        0 => 
        array (
          0 => 
          Facebook::__set_state(array(
             'sharedSessionID' => NULL,
             'appId' => '446458238729594',
             'appSecret' => '>>>APP_SECRET<<<',
             'user' => 0,
             'signedRequest' => NULL,
             'state' => NULL,
             'accessToken' => '446458238729594|>>>APP_SECRET<<<',
             'fileUploadSupport' => false,
             'trustForwarded' => false,
          )),
          1 => '_graph',
        ),
        1 => 
        array (
          0 => '/me',
        ),
      ),
    ),
    4 => 
    array (
      'file' => '/srv/www/htdocs/mysite/web/index.php',
      'line' => 69,
      'function' => 'api',
      'class' => 'BaseFacebook',
      'type' => '->',
      'args' => 
      array (
        0 => '/me',
      ),
    ),
  ),
   'previous' => NULL,
))
--------

User ID is now NULL.


=====>>>>> Session array:
array (
  'counter' => 1,
)

Seems like user is NOT logged in. Getting login url...done.

URL:
Login / Logout


=====>>>>> Session array:
array (
  'counter' => 1,
  'fb_446458238729594_state' => '6ae5ea9e5f7199fb6d19793905dcdd65',
)

Seems like user is still NOT logged in. At now we can't do anything. Try to login using the URL above.

========

Session array:
array (
  'counter' => 1,
  'fb_446458238729594_state' => '6ae5ea9e5f7199fb6d19793905dcdd65',
)

Please, help me figure out, why login does not work? Why the instance of Facebook class does not retrieve the access token? And why the method Facebook::getUser() always returns 0? How can I fix it?

like image 421
user1764823 Avatar asked Oct 23 '12 14:10

user1764823


People also ask

How integrate Facebook API in PHP?

The PHP Facebook SDK is very easy to implement and allows access to to facebook graph APIs for developers. a note of it to use in the PHP code. Create new app by clicking Add New App. Enter all the required details like name, email id and click on Create APP ID to get APP ID and APP SECRET to access the Facebook API.

How do I integrate Facebook login to my website?

You need a Facebook app for your site. Go to https://developers.facebook.com/apps/ and click on the "Create New App" button. I changed the data-show-faces attribute to false because with it set to true the logout button will not render when the user is logged in.

How is PHP used in Facebook?

PHP is used for the front-end, Erlang is used for Chat, Java and C++ are also used in several places (and perhaps other languages as well).


1 Answers

Going to take a stab here - so patience please:

Possible cause 1: Your FB code looks good - but your error states:

"Failed to connect to 2a03:2880:2050:1f01:face:b00c:0:2: Network is unreachable" which points to a cURL issue.

Can you confirm your cURL is installed/working on your webserver? A simple phpinfo(); will tell you.

Possible Cause 2: Check that your app URL is set to the location you are running the tests from. Your redirect URI is "http://mysite.localhost/" - so make sure in your app setup page that it corresponds.

Lastly,

simply start with the basics, and then start adding all your extra code in. This works for me:

<?php

require 'src/facebook.php';

$facebook = new Facebook(array(
  'appId'  => 'xxxxxxxxxxxxxxxxxxx',
  'secret' => 'xxxxxxxxxxxxxxxxxxx',
));

// See if there is a user from a cookie
$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
$logoutUrl = $facebook->getLogoutUrl();
  } catch (FacebookApiException $e) {
    echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
    $user = null;
$loginUrl = $facebook->getLoginUrl($params);
  }
}

?>

<?php if ($user) { ?>
    Your user profile is
    <?php print htmlspecialchars(print_r($user_profile, true)) ?>
    <a href="<?php echo $logoutUrl; ?>">Logout</a>
<?php } else { ?>
    <a href="<?php echo $loginUrl; ?>">Login with Facebook</a>
<?php } ?>'
like image 81
DavidP Avatar answered Oct 03 '22 22:10

DavidP