我在使用Facebook登錄我的網站時遇到問題。使用臉書Facebook for PHP登錄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應用授權頁面。確認請求的權限後,它重定向我到這個網址:
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類的實例不檢索訪問令牌?爲什麼Facebook :: getUser()方法總是返回0?我該如何解決它?
如果捲曲是不可用,PHP SDK會死的已經初始化。對我來說,它看起來更像是他服務器上的一般IPv6連接問題;或者防火牆或者不讓連接到FB服務器的東西通過。 – CBroe
謝謝。問題出在防火牆 - 它阻止了來自本地網絡的外部IPv6連接。 – user1764823
真棒@CBroe - 很好的捕獲。 – Fraccus