php - 使用 Facebook SDK for PHP 登录 Facebook

标签 php facebook-graph-api facebook-php-sdk facebook-login facebook-access-token

我在使用 Facebook 登录我的网站时遇到问题。

我按照 developers.facebook.com 上的教程使用 Facebook SDK 创建了登录,但它对我不起作用。

我写了一个简单的测试页面来找出问题所在。这是代码:

<!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>

第一次访问这个页面后(我没有登录 Facebook),我得到这个输出:

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',
)

然后我尝试使用给定的 URL 登录。它会将我带到我的 Facebook 应用程序授权页面。确认请求的权限后,它将我重定向到此 URL:

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

在那之后,我希望我登录并且我的页面检索并显示我的 Facebook 个人资料中的一些信息,但它没有。我得到这个输出:

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',
)

请帮我弄清楚,为什么登录不起作用?为什么 Facebook 类的实例不检索访问 token ?为什么 Facebook::getUser() 方法总是返回 0?我该如何解决?

最佳答案

要在这里尝试一下 - 请耐心等待:

可能原因一: 您的 FB 代码看起来不错 - 但您的错误状态是:

“无法连接到 2a03:2880:2050:1f01:face:b00c:0:2:网络无法访问”,这表明存在 cURL 问题。

您能否确认您的 cURL 已安装/正在您的网络服务器上运行?一个简单的 phpinfo();会告诉你的。

可能的原因 2: 检查您的应用程序 URL 是否设置为您运行测试的位置。您的重定向 URI 是“http://mysite.localhost/” - 因此请确保在您的应用程序设置页面中它是对应的。

最后,

只需从基础开始,然后开始添加所有额外代码。这对我有用:

<?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 } ?>'

关于php - 使用 Facebook SDK for PHP 登录 Facebook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13032246/

相关文章:

php - 使用 Facebook PHP SDK 4 但没有存储 session

php - mysql_fetch_row() : supplied argument is not a valid MySQL result resource in

php - MySQL 选择多行/组多/顺序

php - 如何使用 Graph API 让用户订阅 facebook 中的事件?

Facebook 图形 API : offset_y offset_x

facebook - 如何在 Facebook Graph API 中获取好友详细信息?

c# - Facebook 数据删除回调给出 "Unable to confirm request was received"

php - Magento - 资源和 mysql4 之间的区别

php - 从数据库发送和检索数据并显示在选择框中,无需刷新 CodeIgniter 中的页面

facebook - 禁用时间轴上的照片分组