Facebook SDK: как использовать JavascriptLoginHelper

0

Я внедряю поток входа в Facebook, используя Javascript + PHP SDK. Я хочу получить токен доступа из Javascript и передать его PHP, который должен его расширить (чтобы получить долгоживущий токен доступа), которые должны быть сохранены в базе данных для создания запросов API в течение месяца. Я совершенно не знаком с веб-разработкой, поэтому для достижения результата в течение ограниченного времени я собирался на тонну документации и учебников и придумал два основных блока кода. Это мой стандартный fb-login.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');

    });
});

и это мой файл "login.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, и у меня есть папка "script", в которой я храню: fb-script.js, login.php и PHP SDK 4 для Facebook. Вне этой папки сценария у меня есть файлы HTML.

Теперь я хотел бы указать на следующие вопросы:

  • Я не могу понять, как javascript sdk и php связаны вместе? Я что-то пропустил или нет никаких доказательств, что у них есть какие-то отношения? Должен ли я вставлять какой-либо код AJAX, чтобы передать что-то в PHP, или Помощник достаточно умен, чтобы справляться со всем?
  • Что я должен ожидать от SERVER-SIDE, когда пользователь нажимает кнопку входа? Я знаю, что на javascript все работает, как я могу проверить PHP? Я попытался посмотреть в базе данных, но там ничего не было, поэтому я пошел на "myhost.it/script/login.php". Но я получаю только пустую страницу. Глядя на консоль, у меня нет ошибок, но когда я обновляю страницу, я получаю "Ошибка 500".
  • Вы можете обнаружить какую-либо ошибку в моем коде? Я отмечу 100% уверенность в том, что я делаю, и это немного разочаровывает.

Надеюсь, я дал понять, спасибо всем за ваше время и усилия в том, чтобы прочесть это и помочь мне.

Приветствую вас, Джакомо

  • 0
    Единственный способ, которым JS SDK и PHP SDK «работают вместе», - это обмен файлами cookie, установленными в вашем домене. И на стороне сервера ничего не происходит, когда вы нажимаете кнопку входа на стороне клиента - все, что вы хотите , вы должны реализовать сами. // Что касается вашей ошибки 500 - только вы можете выяснить, откуда это происходит, поэтому идите и примите соответствующие меры.
  • 0
    Да, после входа в javascript отправьте запрос Ajax на php вместе с идентификатором пользователя и токеном доступа. затем в php используйте тот же идентификатор приложения и с токеном доступа и идентификатором пользователя, которые вы получили от javascript, чтобы запросить долгоживущий токен доступа, как только вы его получите, сохраните его в базе данных и отправьте ответ обратно в javascript и сделайте то, что вы хотите сделать разбор ответа.
Показать ещё 3 комментария
Теги:
facebook
facebook-graph-api
server-communication

1 ответ

0

Я решил все свои проблемы до сих пор: мне не нужен AJAX POST от Client to Server, поскольку JavascriptLoginHelper заботится обо всех процессах.

Чтобы понять, какие проблемы у меня возникли на сервере (Ошибка 500), я открыл терминал и написал: ssh [email protected]. (Host) вставил пароль, а затем проверил error.log на моем сервере используя 'sudo tail/var/log/apache2/error.log' (Мой хост - DigitalOcean). С тех пор мне удалось отладить все проблемы на стороне сервера.

Моя ошибка связана с тем, что "autoload.php" имеет небольшую ошибку. Действительно, я открыл его и должен был заменить '/src/Facebook/' на /src/lib/Facebook/'в autoload.php в строке 49. Сейчас все работает нормально.

Спасибо всем вам за ваши предложения и пожелания, это может быть полезно кому-то.

Ура!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню