2012-04-06 96 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

相关问题