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

Я реализую поток входа в 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% уверен, что делаю, и это немного расстраивает.

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

Привет,
Giacomo

0

Решение

Я решил все свои проблемы до сих пор:
Мне не нужно было никакого AJAX POST от клиента к серверу, так как 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. Сейчас все работает нормально.

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

Ура!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]