可以';成功进行Facebook身份验证后无法检索用户id


Can't retrieve user id after successful Facebook authentication

我很难通过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参数向graph.facebook.com/oauth/access_token提出了一个手动请求,但我确实收到了access_token。现在,剩下的唯一问题是如何通过PHP SDK实现这一点?

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,使用没有获得用户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;

请将此行更改为此

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

更改为

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

因为你使用的是你的api,而不是其他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);
    ?>

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

希望这能为某人节省几个小时的代码跟踪时间。