2012-02-19 171 views
1

我无法通过Facebook PHP SDK对用户进行身份验证。成功Facebook身份验证后无法检索用户ID

基本上我想显示一个“用facebook登录”按钮,如果用户还没有通过身份验证。否则,请提供用户名称。这里是代码:

require_once 'facebook.php'; 
$facebook = new Facebook(array(
     'appId' => 'XXX', 
     'secret' => 'XXX', 
     'cookie' => true 
)); 
$userId = $facebook->getUser(); 
var_dump($userId); 
if ($userId) { 
    $userInfo = $facebook->api('/' . $userId); 
    echo "Welcome, {$userInfo['name']}"; 
} else { 
    echo '<a href="' . $facebook->getLoginUrl() . '">' . 
'<img src="images/icon_facebook_login.png" alt="Login with Facebook" /></a>'; 
} 

麻烦是我总是得到0从$facebook->getUser()。我查看了base_facebook.php中的代码,并且在处理该函数时,预计将在返回URL中请求参数signed_request。我在URL Facebook返回的唯一参数是codestate

任何想法,我可能会搞砸了吗?提前致谢。

编辑:正如ogi建议我做与code PARAM一个手工制作的请求graph.facebook.com/oauth/access_token,我确实收到access_token。现在,剩下的唯一问题就是如何通过PHP SDK来完成这个任务?

回答

0

问题是我没有fb_ca_chain_bundle.crt文件复制到该目录,其中facebook.phpbase_facebook.php居住。在getAccessTokenFromCode()代码facebook.com/oauth/access_token...失败,但由于他们捕获异常,很难弄清楚。

希望这可以节省一些人几个小时的代码跟踪。

2

画布应用程序(Facebook上的应用程序)始终从顶部框架 - 从Facebook获得signed_request

外部网站不。在用户批准该应用程序后,他们会收到code,显然您也是这样做的。

认证的最后一点是交换codeaccess_token,这是你应该测试自己。因此,获得来自请求的代码,并尝试在浏览器中执行以下操作:

https://graph.facebook.com/oauth/access_token? 
    client_id=YOUR_APP_ID&redirect_uri=YOUR_URL& 
    client_secret=YOUR_APP_SECRET&code=THE_CODE 

(用于redirect_uri使用不是得到一个用户ID相同的URL)

看看你。然后发布一个更新您的问题,我们将看到:-)

编辑

如果你不这样做,它有PHP的显示器,而你正在开发的所有错误是很重要的:

error_reporting = E_ALL 

(在php.ini)

认证的最后一位使用curl获得通过https访问令牌。我不是一个专家卷曲,但这可以帮助克服SSL问题:

Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false; 
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2; 
+0

感谢您的回答,ori。我收到'access_token'。现在,如何通过PHP SDK进行此请求? – 2012-02-19 22:29:41

0

请更改此行此

$userInfo = $facebook->api('/' . $userId); 

变化

$userInfo = $facebook->api('/me'); 

由于您使用OUTH你的API不是另一个。

然后

尝试

echo $userInfo['id'] 

,或者你可以使用这个完全控制

<?php 
    require 'fb/facebook.php'; 

    // Create our Application instance (replace this with your appId and secret). 
    $facebook = new Facebook(array(
     'appId' => 'xxx', 
     'secret' => 'xxx', 
    )); 

    // Get User ID 
    $user = $facebook->getUser(); 

    // We may or may not have this data based on whether the user is logged in. 
    // 
    // If we have a $user id here, it means we know the user is logged into 
    // Facebook, but we don't know if the access token is valid. An access 
    // token is invalid if the user logged out of Facebook. 

    if ($user) { 
     try { 
     // Proceed knowing you have a logged in user who's authenticated. 
     $user_profile = $facebook->api('/me'); 
     } catch (FacebookApiException $e) { 
     error_log($e); 
     $user = null; 
     } 
    } 

    // Login or logout url will be needed depending on current user state. 
    if ($user) { 
     $logoutUrl = $facebook->getLogoutUrl(); 
    } else { 
     $loginUrl = $facebook->getLoginUrl(); 
    } 


echo '<pre>'; 
print_r($user_profile); 

    ?> 
+0

'getUser()'总是返回0.你的例子也一样,它基本上是一样的。 – 2012-02-19 22:39:51

+0

我正在使用它,因为它是在我的网站上,它显示我fb用户确切ID ...请重新生成您的秘密密钥或检查会议真正开始...并检查您的密钥... – 2012-02-19 23:12:33