0

Я реализую поток входа в Facebook, используя Javascript + PHP SDK. Я хочу получить токен доступа из Javascript и передать его PHP, который должен его расширить (чтобы получить долгоживущий токен доступа), которые должны быть сохранены в базе данных для создания запросов API в течение месяца. Я совершенно не знаком с веб-разработкой, поэтому, чтобы добиться результата за ограниченное количество времени, я собирался много документации и учебников и придумал эти два основных блока кода. Это мои самые стандартные FB-login.jsFacebook SDK: Как использовать JavascriptLoginHelper

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

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

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

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

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

+0

Единственный способ, с помощью которого JS SDK и PHP SDK «работать вместе» - это совместное использование файлов cookie, установленных в вашем домене.И серверная сторона ничего не происходит, когда вы нажимаете кнопку входа на стороне клиента - что бы вы ни делали, вы должны реализовать себя. // Что касается вашей ошибки 500 - только вы можете исследовать, откуда это происходит, поэтому идите и выполните соответствующие шаги. – CBroe

+0

Да, после входа в систему javascript отправьте запрос Ajax на php вместе с идентификатором пользователя и токеном доступа. то в php используйте один и тот же идентификатор приложения и маркер доступа и идентификатор пользователя, который вы получили от javascript для запроса долгоживущего токена доступа, после его получения, сохраните его в базе данных и отправьте ответ на javascript и сделайте то, что хотите проанализируйте ответ. –

+0

Спасибо за ваши ответы. Я понимаю, что данные передаются с использованием файлов cookie сеанса. Но весь процесс связи между JS и PHP не должен обрабатываться JavascriptLoginHelper? Должен ли я все же передавать токен с помощью AJAX Call? –

ответ