2012-04-06 127 views
1

當用戶與Facebook連接,來到我的網頁的getUser()返回0。的getUser()在第一個頁面加載

在我使用此代碼返回0:

include 'includes/php/facebook.php'; 
$app_id = "APP_ID"; 
$app_secret = "SECRET_KEY"; 
$facebook = new Facebook(array(
    'appId' => $app_id, 
    'secret' => $app_secret, 
    'cookie' => true 
));  

$user = $facebook->getUser(); 
if($user){ 
    try { 
     $user_profile = $facebook->api('/me'); 
    }catch(FacebookApiException $e) { 
     error_log($e); 
    } 
} 

當頁面完全加載FB.Event返回「連接」。

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

}); 

然後頁面加載兩次。在此之後,用戶與我的頁面連接。

這是正確的,頁面必須加載兩次?我認爲這不是用戶友好的。知道別人可能性嗎?

爲什麼getUser()在第一頁加載時返回0?

編輯2:

當我使用服務器端身份驗證的示例。用戶與Facebook連接,我得到了用戶的詳細信息。

<?php 

$app_id = "YOUR_APP_ID"; 
$app_secret = "YOUR_APP_SECRET"; 
$my_url = "YOUR_URL"; 

session_start(); 
$code = $_REQUEST["code"]; 

if(empty($code)) { 
    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 
    $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
    . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" 
    . $_SESSION['state']; 

echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
} 

if($_REQUEST['state'] == $_SESSION['state']) { 
$token_url = "https://graph.facebook.com/oauth/access_token?" 
    . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) 
    . "&client_secret=" . $app_secret . "&code=" . $code; 

$response = file_get_contents($token_url); 
$params = null; 
parse_str($response, $params); 

$graph_url = "https://graph.facebook.com/me?access_token=" 
    . $params['access_token']; 

$user = json_decode(file_get_contents($graph_url)); 
echo("Hello " . $user->name); 
} 
else { 
    echo("The state does not match. You may be a victim of CSRF."); 
} 

?> 

當用戶沒有與Facebook連接時,在我回到我的頁面之前,我收到對話框。我是否也可以在沒有對話的情況下查詢與Facebook的連接?或者我可以通過其他方式來創建CSRF?

+0

我不明白,你想用服務器端或客戶端流來驗證用戶嗎? (即使用PHP或JS) – 2012-04-06 13:35:53

+0

與服務器端,但getUser()返回0,然後我測試它與客戶端(FB.Event),並返回「連接」。我不明白,爲什麼getUser()在第一頁加載時返回0? – 2012-04-06 17:45:33

回答

0

我不確定你是否沒有發佈驗證用戶的代碼,或者你只是不這樣做。 構建Facebook對象是不夠的,你需要驗證用戶與Facebook。

您是否閱讀過認證文檔? 有兩種類型的流程可以從您的代碼中獲取Server-SideClient-Side,您似乎需要使用服務器端流程以獲得php端的用戶訪問令牌,然後調用getUser方法應該返回你想要的用戶對象。

如果我錯了,並且您在對用戶進行身份驗證,請修改您的問題並添加用於此目的的代碼。

+0

我使用服務器端和用戶進行身份驗證。這不是問題。但是當用戶回到我的頁面並且它與Facebook連接時,我會在用戶頁面上自動連接用戶。 – 2012-04-07 08:01:40

+0

所以我測試了與客戶端的連接。當我使用:FB.Event.subscribe('auth.statusChange',function(response){console.log(response)});它在第一頁加載時迴應用戶與Facebook「連接」。怎麼知道FB.Event這個?爲什麼我可以在第一頁加載時使用php sdk調用這個函數? – 2012-04-10 07:30:39

+0

您是否正確實施了服務器端認證流程?可能不會,因爲它不適合你。請閱讀[服務器端身份驗證文檔](http://developers.facebook.com/docs/authentication/server-side/),那裏有一個**完整的php示例,您是否使用過它?如果是這樣,請**使用您正在使用的代碼編輯您的原始**問題,所有這些都是相關的,這是不可能的。 – 2012-04-10 07:36:33

相關問題