成功进行Facebook身份验证后无法检索用户ID

时间:2012-02-19 22:03:51

标签: php facebook facebook-php-sdk

我无法通过Facebook PHP SDK验证用户身份。

如果用户尚未经过身份验证,我基本上想要显示“使用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>';
}

问题是我总是从$facebook->getUser()得到0。我查看了base_facebook.php中的代码,在处理函数时,返回URL中需要一个请求参数signed_request。我在Facebook返回的URL中看到的唯一参数是codestate

我可能搞砸了什么想法?提前谢谢。

编辑:根据ogi的建议,我向code的{​​{1}}参数做了一个手工制作的请求,我收到了graph.facebook.com/oauth/access_token 。现在,剩下的唯一问题是如何通过PHP SDK实现这一目标?

3 个答案:

答案 0 :(得分:2)

Canvas应用程序(Facebook上的应用程序)总是从顶部框架收到signed_request - 来自Facebook。

外部网站没有。在用户批准该应用后,他们会获得code,显然您也会这样做。

最后一点身份验证是为code交换access_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使用与未获得用户标识的相同网址)

看看你得到了什么。然后发布您的问题的更新,我们将看到: - )

修改

如果您没有这样做,在开发过程中让php显示所有错误非常重要:

error_reporting  =  E_ALL

(在你的php.ini中)

最后一位身份验证使用curl通过https获取访问令牌。我不是卷毛专家,但这可以帮助克服ssl问题:

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

答案 1 :(得分:0)

请将此行更改为此

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

更改为

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

因为你使用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);

    ?>

答案 2 :(得分:0)

问题是我没有将fb_ca_chain_bundle.crt文件复制到facebook.phpbase_facebook.php所在的目录。在getAccessTokenFromCode()中,facebook.com/oauth/access_token...的代码失败,但由于它们捕获了异常,因此很难弄明白。

希望这可以节省一些时间的代码跟踪。