Facebook SDK:如何使用 JavascriptLoginHelper


Facebook SDK: How to use JavascriptLoginHelper

我正在使用Javascript + PHP SDK实现Facebook登录流程。我想从Javascript获取访问令牌并将其传递给PHP,PHP应该扩展它(以获得长期存在的访问令牌),该令牌必须存储在数据库中以便在一个月内发出API请求。我对 Web 开发完全陌生,所以为了在有限的时间内达到结果,我浏览了大量的文档和教程,并提出了这两个主要的代码块。这是我非常标准的 fb 登录.js

function openWindow(url){
  window.open(url, '_blank');
  window.focus();
}
function statusChangeCallback(response) {
    if (response.status === 'connected') {     //user is authorized
        getUserData();
    } else {  //user is not authorized
    }}
window.fbAsyncInit = function() {
    //SDK loaded, initialize it
    FB.init({
        appId      : XXXXXXXXXX,
        xfbml      : true,
        cookie     : true,
        version    : 'v2.2'
    });
    //check user session and refresh it
    FB.getLoginStatus(function(response) {
            statusChangeCallback(response);
    });
};

//load the JavaScript SDK
(function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
//add event listener to login button
document.addEventListener("DOMContentLoaded", function() { 
    document.getElementById('loginBtn').addEventListener('click', function() {
        //do the login
        FB.login(function(response) {
            if (response.authResponse) {
                var accessToken = response.authResponse.accessToken;
                console.log(accessToken);
                getUserData();
                //user just authorized your app               
            }
        }, {scope: 'email,public_profile,user_events,user_videos,user_photos,user_groups,user_friends,user_likes,user_tagged_places,user_actions.books,read_mailbox,read_stream', return_scopes: true});
        //window.location.assign("http://www.giacomogiorgianni.me/questionnaire.html");
    openWindow('//www.giacomogiorgianni.me/questionnaire.html');
    });
});

这是我的"登录.php"文件:

require 'fb-php-sdk4/autoload.php'
/* USE NAMESPACES */
use Facebook'FacebookSession;
use Facebook'FacebookJavascriptLoginHelper;
use Facebook'FacebookRequest;
use Facebook'FacebookRequestException
use Facebook'FacebookResponse;
use Facebook'FacebookSDKException;

use Facebook'GraphObject;
use Facebook'GraphUser;
use Facebook'GraphSessionInfo;
use Facebook'Entities'AccessToken; 
$app_id = XXXXXXXXXXXXX;
$app_secret= XxXxxxxxxxXXXXxXXXXxxxXXXXxXX;
//Initialize application, create helper object and get fb sess
FacebookSession::setDefaultApplication($app_id,$app_secret);
session_start();
//check for existing session and validate it
if (isset($_SESSION['token'])) {
  $session = new FacebookSession($_SESSION['token']);
  if (!$session->Validate($app_id, $app_secret)) {
    unset($session);
  }
}
//get new session
if (!isset($session)) {
  try {
    $helper = new FacebookJavaScriptLoginHelper();
    $session = $helper->getSession();
    $_SESSION['token'] = $session->getToken();
    $token = $_SESSION['token'];
    $longLivedToken = $token->extend();
  } catch(FacebookRequestException $e) {
    unset($session);
    echo $e->getMessage();
  }
}
if (isset($session)) {
  $me = (new FacebookRequest(
    $session, 'GET', '/me'
  ))->execute()->getGraphObject(GraphUser::className());
  //$id = $me->getId();
  $name = $me->getName();
  echo $name;
}
// Database connection
$user = "root";
$password = "XXXXXXX";
try{
    $db = new PDO("mysql:host=127.0.0.1;dbname=prova",$user,$password);
    var_dump($db);
    //GGracefully handling Errors
    setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    echo "Connessione riuscita";
} catch (Exception $e) {
    echo "Impossibile connettersi al Database /n";
    echo 'E'' stato rilevato il seguente errore: ' . $e->getMessage();
    exit;
}
try{
    $sql = "INSERT INTO prova (id, name, access_token_id) VALUES ($id, $name, $longLivedToken)";
    $db->exec($sql);
    echo "Record inserito nella tabella";
    } catch {
        echo "Impossibile inserire la query";
        echo 'E'' stato rilevato il seguente errore: ' . $e->getMessage();
        exit;
}
    $conn = null;

正在一个Linux服务器上工作,在那里我设置了LAMP和MySQL,我有一个"脚本"文件夹,我保存在其中:fb-script.js,login.php和Facebook的PHP SDK 4。在这个脚本文件夹之外,我有我的 HTML 文件。

现在我想指出以下问题:

  • 我真的无法理解javascript sdk和php是怎么回事。捆绑在一起?我错过了什么还是没有证据表明他们有什么关系吗?我应该插入任何要传递的 AJAX 代码吗PHP或助手的东西足够聪明,可以处理万事?
  • 当用户单击服务器端时,我应该期望会发生什么登录按钮?我知道在javascript上一切正常,我如何检查PHP?我试图查看数据库,但那里什么都没有,所以我继续"myhost.it/script/login.php"。但我只得到一张白纸。查看控制台,我没有错误,但是当我刷新页面时,我得到"错误500"。
  • 你能发现我的代码中的任何错误吗?我注意到 100% 确定我在做什么,这有点令人沮丧。

我希望我说清楚了感谢大家花时间和精力阅读本文并帮助我。

问候贾科莫

到目前为止,我解决了所有问题:我不需要从客户端到服务器的任何AJAX POST,因为JavascriptLoginHelper负责所有过程。

为了了解我在服务器上遇到了哪种问题(错误 500),我打开终端并编写:ssh server_username@xxx.xxx.xxx.xxx。(host)插入密码,然后使用"sudo tail/var/log/apache2/error.log"在我的服务器上检查错误.log(我的主机是DigitalOcean)。从那时起,我能够在服务器端调试所有问题。

我的错误是由于"自动加载.php"有一个小错误。事实上,我打开了它,不得不在第 49 行的自动加载中将"/src/Facebook/"替换为"/src/lib/Facebook/.php。现在一切正常。

谢谢大家的建议,这对某人有用。

干杯!