在PHP中使用SDK 4.0登录Facebook只返回用户的全名和id,而不返回其他信息



我正在我的网站中集成Facebook登录。我使用的是Facebook SDK 4.0。我的应用程序API版本是2.4。当用户成功登录Facebook时,我正在尝试获取基本的个人资料信息。但问题是,我只能得到用户id和他的全名。其他信息如名字、姓氏、性别等都没有收到。当然,稍后我还需要个人的电子邮件和用户档案图片。这是我的工作代码,只打印名称和id:

<?php
// start session
session_start();
$app_id = 'app_id'; // Facebook App ID
$api_secret = 'app_secret'; // Facebook App Secret
$required_scope = 'public_profile, publish_actions, email'; // Permissions required
$redirect_url = 'site_url/index.php'; // FB redirects to this page with a code
require_once __DIR__ . "/facebook-php-sdk-v4.0/autoload.php";
use FacebookFacebookSession;
use FacebookFacebookRequest;
use FacebookGraphUser;
use FacebookFacebookRedirectLoginHelper;
// init app with app id (APPID) and secret (SECRET)
FacebookSession::setDefaultApplication($app_id,$api_secret);
// login helper with redirect_uri
$helper = new FacebookRedirectLoginHelper( $redirect_url  );
try {
  $session = $helper->getSessionFromRedirect();
} catch( FacebookRequestException $ex ) {
  // When Facebook returns an error
} catch( Exception $ex ) {
  // When validation fails or other local issues
}
// see if we have a session
if ( isset( $session ) ) {
  // graph api request for user data
  $request = new FacebookRequest( $session, 'GET', '/me' );
  $response = $request->execute();
  // get response
  $graphObject = $response->getGraphObject();
  // print data
  echo "<pre>";
  echo  print_r( $graphObject, 1 );
  echo "</pre>";
} else {
  // show login url
  echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';
}

打印以下信息:

FacebookGraphObject Object
(
    [backingData:protected] => Array
        (
            [name] => Fname Lname
            [id] => ID
        )
)

您可以看到,我已经给出了scope参数。但这对我没有帮助。然后我开始在STO上搜索,找到了一些解决方案,建议我们添加以下代码行,如果你使用API v2.4明确提到你想要的字段:

$request = (new FacebookRequest($this->session, 'GET', '/me/?fields=friends,id,name,birthday,email,picture,gender,location,address,email,hometown'))->execute()->getGraphObject()->asArray();   

但当我使用上面的代码时,它再次不起作用,相反,我得到了一个空白屏幕,甚至没有以前的id和name。

我还访问了Facebook开发人员文档,但它们太长、太复杂,而且不够用户友好,开发人员可以在短时间内轻松地遵循它们。

我认为在Facebook登录方面有很多困惑。网上有很多文章,每一篇都阐述了自己的方法。一些人使用PHP,另一些人也使用弹出登录窗口的JavaScript。老实说,我在这个层面上很困惑,不明白哪种是最好的、推荐的和完成任务的工作方法。因此,我正在寻找以下问题:

  1. 我想得到帮助,使我的上面的代码工作,这样它就可以获取有关用户的所有信息,包括电子邮件和个人资料图片
  2. 一些使用Facebook登录的方法会让用户进入完整的登录页面,而另一些方法则会显示一个登录弹出窗口,用户在成功登录后仍停留在最初生成弹出窗口的同一页面上。两者有何不同
  3. 使用Facebook登录的最佳实践是什么。还应该使用哪个SDK和Graph API版本

生成登录URL时,必须传递您寻求权限的scopes。你可以通过修改生成这个,

echo '<a href="' . $helper->getLoginUrl() . '">Login</a>';

echo '<a href="' . $helper->getLoginUrl(array('public_profile','email', 'user_friends')) . '">Login</a>';

这只是一个例子,可能无法满足您的所有要求。您可能需要根据需要添加更多的作用域。

默认情况下,以上三个范围都是允许的,您不必通过facebook的应用程序验证。但如果你添加了任何其他范围,你可能需要经过审批流程才能使用应用程序。

当然,从v2.4开始,您必须明确要求每个字段。在email之前,默认情况下/me已提供,不再提供。你必须像一样添加它

 /me?fields=id,first_name,last_name,friends,email

如果用户已经登录,使用facebook登录不会要求登录,如果用户以前没有授予该应用程序权限,则会立即进入权限屏幕。若用户已经给出了所有权限,并且他已经登录了facebook,点击带有facebook链接的登录将立即将用户重定向到重定向处理程序。

我建议,你应该始终使用最新的稳定的facebook api。

更新

刚刚意识到facebook允许使用一个电话号码创建帐户。所以,如果用户用电话号码而不是电子邮件创建了一个帐户,在api响应中,你会收到电话号码代替电子邮件,如下所示,

...
'email' => '465454654654'
...

因此,您的代码必须处理这种情况。

最新更新