簡體   English   中英

在PHP中使用SDK 4.0使用Facebook登錄僅返回用戶的全名和ID,而沒有其他任何信息

[英]Login with Facebook using SDK 4.0 in PHP returns only full name and id of user and nothing else

我正在將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 Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRedirectLoginHelper;

// 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>';
}

打印以下信息:

Facebook\GraphObject 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和名稱。

我還訪問了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開始,您必須明確要求每個字段。 在默認情況下,使用/me提供email之前,不再有。 您必須像這樣添加

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

如果用戶已經登錄,使用Facebook登錄將不要求登錄,如果用戶之前未授予該應用程序許可,將立即進入許可屏幕。 如果用戶已經擁有所有權限並且已經登錄了facebook,則單擊帶Facebook登錄的鏈接將重定向用戶以立即重定向處理程序。

我建議您始終使用最新的穩定的Facebook API。

更新

剛剛意識到,facebook允許使用電話號碼創建帳戶。 因此,如果用戶使用電話號碼而非電子郵件創建了一個帳戶,則在api響應中,您將收到電話號碼代替電子郵件,如下所示,

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

因此,您的代碼必須處理這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM