Facebook getUser()在加载第一页时返回0

Facebook getUser()在加载第一页时返回0,facebook,facebook-graph-api,facebook-php-sdk,Facebook,Facebook Graph Api,Facebook Php Sdk,当用户连接到Facebook并出现在我的页面上时,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 ));

当用户连接到Facebook并出现在我的页面上时,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.事件返回已连接

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吗?

我不确定您是否只是没有发布用于验证用户身份的代码,或者您只是没有执行该部分。。 仅仅构造一个Facebook对象是不够的,您需要使用Facebook对用户进行身份验证

你看过认证文档了吗? 您可以使用两种类型的流,从代码中可以看出,您需要使用服务器端流,以便在php端为用户提供访问令牌,然后对getUser方法的调用应该返回您想要的用户对象


如果我弄错了,您正在验证用户,请编辑您的问题并添加用于验证的代码。

我不明白,您是在尝试使用服务器端流还是客户端流验证用户?这是在服务器端使用php或jsp,但是getUser返回0,然后我使用客户端FB.Event测试它,并连接此返回。我不明白,为什么getUser在加载第一页时返回0?我使用服务器端和用户对其进行身份验证。这不是问题所在。但是当一个用户返回到我的页面并与facebook连接时,我会在我的页面上自动连接该用户。因此,我测试了与客户端的连接。当我使用时:FB.Event.subscribe'auth.statusChange',functionresponse{console.logresponse};当用户连接到Facebook时,它会在第一个页面加载时做出响应。你怎么知道这件事?为什么我可以在第一个页面加载时使用PHPSDK调用它?您是否正确地实现了服务器端身份验证流?可能不会,因为它不适合你。请阅读,这里有一个完整的php示例,您使用过吗?如果是这样,请用你正在使用的代码编辑你的原始问题,所有这些都是相关的,这是不可能帮助你的。